利用Spring、JNDI切换数据源
publicclass DataSourceManager extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
String key = ContextHolder.getDataSource();// 获取key
return key;// 返回当前线程实际的DataSource对应的Key
}
}
publicclass ContextHolder {
publicstaticfinal ThreadLocal<String> context = new ThreadLocal<String>();
publicstatic String getDataSource() {
returncontext.get();
}
publicstaticvoid setDataSource(String dataSource){
context.set(dataSource);
}
publicstaticvoid clear() {
context.remove();
}
}
<!-- 使用JBOSS jndi resourceRef属性用来指定是否预准备前缀:java:comp/env/,默认false-->
<bean id="dataSource1" class="org.springframework.jndi.JndiObjectFactoryBean"
lazy-init="true">
<property name="jndiName" value="java:TestDb" />
<property name="resourceRef" value="true" />
</bean>
<!-- 使用JBOSS jndi-->
<bean id="dataSource2" class="org.springframework.jndi.JndiObjectFactoryBean"
lazy-init="true">
<property name="jndiName" value="java:OracleDS" />
<property name="resourceRef" value="true" />
</bean>
<!-- 用JNDI的切换实现切库操作-->
<bean id="dataSource" class="dynamicDataSource.DataSourceManager">
<property name="targetDataSources">
<map>
<entry key="mysql" value-ref="dataSource1" /> <entry key="oracle" value-ref="dataSource2" />
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource1" />
</bean>
切库语句:
ContextHolder.setDataSource("oracle");//默认库为mysql数据库,在此切换为Oracle数据库