Win a copy of Micro Frontends in Action this week in the Server-Side JavaScript and NodeJS forum!
  • Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Ron McLeod
  • Paul Clapham
  • Bear Bibeault
  • Junilu Lacar
Sheriffs:
  • Jeanne Boyarsky
  • Tim Cooke
  • Henry Wong
Saloon Keepers:
  • Tim Moores
  • Stephan van Hulst
  • Tim Holloway
  • salvin francis
  • Frits Walraven
Bartenders:
  • Scott Selikoff
  • Piet Souris
  • Carey Brown

Multiple Database

 
Greenhorn
Posts: 6
  • 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
 
Ranch Hand
Posts: 198
  • 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.
 
pie sneak
Posts: 4727
Mac VI Editor Ruby
  • 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.
 
Clowns were never meant to be THAT big! We must destroy it with this tiny ad:
Thread Boost feature
https://coderanch.com/t/674455/Thread-Boost-feature
reply
    Bookmark Topic Watch Topic
  • New Topic