File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
http://aspose.com/file-tools
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

Multiple Database

 
Krishnakumar Ramanathan
Greenhorn
Posts: 6
  • 0
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi all,

I need to switch databases at run time, in my application user is allowed to choose the database from the list of databases, I try to use AbstractRoutingDataSource

this is my java class which sets the new Database

package com.ncsts.view.bean;

import org.springframework.util.Assert;

public class ChangeContextHolder {
public enum DataBaseType {
DEMO1,
DEMO2,
DEMO3,

}

private static final ThreadLocal<DataBaseType> contextHolder =
new ThreadLocal<DataBaseType>();
public static void setDataBaseType(DataBaseType dataBaseType) {
Assert.notNull(dataBaseType, "DataBaseType cannot be null");
contextHolder.set(dataBaseType);
}

public static DataBaseType getDataBaseType() {
return (DataBaseType)contextHolder.get();

}

public static void clearDataBase() {
contextHolder.remove();
}
}

this is my class which extends AbstractRoutingDataSource

package com.ncsts.view.bean;



import java.util.Map;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class RoutingDataSource extends AbstractRoutingDataSource{
private Map targetDataSources;
private Object defaultTargetDataSource;


@Override
protected Object determineCurrentLookupKey() {
return ChangeContextHolder.getDataBaseType();
}

}

this is my context.xml file

<bean id="parentDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
abstract="true">
<property name="driverClassName" value="${db.driverClassName}"></property>
<property name="username" value="${db.1.username}"></property>
<property name="password" value="${db.1.password}"></property>
</bean>
<bean id="db3DataSource" parent="parentDataSource">
<property name="url" value="${db.1.url}"></property>
</bean>
<bean id="db2DataSource" parent="parentDataSource">
<property name="url" value="${db.2.url}"></property>
</bean>

<bean id="dataSource"
class="com.ncsts.view.bean.RoutingDataSource">
<property name="targetDataSources">
<map>
<entry key="com.ncsts.view.bean.ChangeContextHolder.DataBaseType.DEMO1"
value-ref="db3DataSource" />
<entry
key="com.ncsts.view.bean.ChangeContextHolder.DataBaseType.DEMO2"
value-ref="db2DataSource" />
</map>
</property>
<property name="defaultTargetDataSource" ref="db2DataSource" />
</bean>


can anybody help me to point out where I am going wrong
 
Vinod K Singh
Ranch Hand
Posts: 198
  • 0
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
From your message it is not clear, what problem you are facing. Also formatting the code will increase the readability and people will be able to help you out.
 
Marc Peabody
pie sneak
Sheriff
Posts: 4727
Mac Ruby VI Editor
  • 0
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
What are you trying to accomplish with ThreadLocal? If this is for a web application, I don't think this class will behave the way you're expecting.
 
It is sorta covered in the JavaRanch Style Guide.
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic