java不同的数据源如何处理_如何在spring框架中解决多数据源的问题

private DataSource dataSource = null;

public MultiDataSource(DataSource dataSource){

this.dataSource = dataSource;

}

/* (non-Javadoc)

* @see javax.sql.DataSource#getConnection()

*/

public Connection getConnection() throws SQLException {

return getDataSource().getConnection();

}

//其它DataSource接口应当实现的方法

public DataSource getDataSource(){

return this.dataSource;

}

}

public void setDataSource(DataSource dataSource) {

this.dataSource = dataSource;

}

}

客户在发出请求的时候,将dataSourceName放到request中,然后把request中的数据源名通过调用new MultiDataSource(dataSource)时可以告诉客户需要的数据源,就可以实现动态切换数据源了。但细心的朋友会发现这在单例的情况下就是问题的,因为在系统中只有一个对象,它的实例变量也只有一个,就如同一个静态变量一般。正因为如此,(三)单例模式下的MultiDataSource

在单例模式下,由于我们在每次调用MultiDataSource

log.debug("dataSourceName:"+dataSourceName);

try{

if(dataSourceName==null||dataSourceName.equals("")){

return this.dataSource;

}

return (DataSource)this.applicationContext.getBean(dataSourceName);

}catch(NoSuchBeanDefinitionException ex){

throw new DaoException("There is not the dataSource

}

}

值得一提的是,我需要的数据源已经都在spring就是其对应的bean id="dataSource1"

class="org.apache.commons.dbcp.BasicDataSource">

oracle.jdbc.driver.OracleDrivervalue>

property>

......

bean>

class="org.apache.commons.dbcp.BasicDataSource">

oracle.jdbc.driver.OracleDrivervalue>

property>

......

bean>

为了得到spring,并且实现方法:

java 代码

private ApplicationContext applicationContext = null;

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

this.applicationContext = applicationContext;

}

如此这样,我就可以通过得到了。

(四)通过线程传递dataSourceName

查看以上设计,MultiDataSource58696c8a-fd62-4a7f-b6f1-1973c1ef7954.jpg

class SpObserver {

private static ThreadLocal local = new ThreadLocal();

public static void putSp(String sp) {

local.set(sp);

}

public static String getSp() {

return (String)local.get();

}

}

做一个filter,将request中的dataSourceName对象。

String sp = SpObserver.getSp();

return getDataSource(sp);

}

完整的MultiDataSource(五)动态添加数据源

通过以上方案,我们解决了动态分配数据源的问题,但你可能提出疑问:方案中的数据源都是配置在spring中(见附件)。不通过配置文件直接加载对象,在的源码中也有,感兴趣的朋友可以自己研究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值