这两天一直在测试多数据源切换,在网上找了好多代码,自己也测试了好多遍,就是实现不了,结果发现是数据源里的连接池的问题。
1、配置数据源
<bean id="dataSource1" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="alias" value="proxoolDataSource1"/>
--->【proxoolDataSource1】这个就是连接池,不同的数据源这个值不能相同,之前设置成一样的了,所以一直没法实现数据源的切换,而看别人写的代码里使用的是 com.mchange.v2.c3p0.ComboPooledDataSource,c3p0连接池,所以没有想到去修改连接池。
此处省略数据库配置..........
</bean>
<bean id="dataSource2" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="alias" value="proxoolDataSource2"/>
此处省略数据库配置..........
</bean>
<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="alias" value="proxoolDataSource"/>
<property name="driver" value="${connection.driver_class}" />
<property name="driverUrl" value="${connection.url}" />
<property name="user" value="${connection.username}" />
<property name="password" value="${connection.password}" />
<property name="maximumConnectionCount" value="${proxool.maximum.connection.count}"/>
<property name="minimumConnectionCount" value="${proxool.minimum.connection.count}" />
<property name="statistics" value="${proxool.statistics}" />
<property name="simultaneousBuildThrottle" value="${proxool.simultaneous.build.throttle}"/>
</bean>
2、通过key-value关联数据源
<bean id="multipleDataSource" class="hibernate.DynamicDataSource">
<property name="defaultTargetDataSource" ref="dataSource"/>
<property name="targetDataSources">
<map key-type="java.lang.String">
<!-- 注意这里的value是和上面的DataSource的id对应,key要和下面的CustomerContextHolder中的常量对应 -->
<entry value-ref="dataSource1" key="dataSource1"/>
<entry value-ref="dataSource2" key="dataSource2"/>
<entry value-ref="dataSource" key="dataSource"/>
</map>
</property>
</bean>
3、sessionFactory及事务的配置
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
<property name="dataSource" ref="multipleDataSource"/>
<property name="packagesToScan">
<list>
<value>com.manage</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.query.substitutions">${hibernate.query.substitutions}</prop>
<prop key="hibernate.default_batch_fetch_size">${hibernate.default_batch_fetch_size}</prop>
<prop key="hibernate.max_fetch_depth">${hibernate.max_fetch_depth}</prop>
<prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
<prop key="hibernate.bytecode.use_reflection_optimizer">${hibernate.bytecode.use_reflection_optimizer}</prop>
<prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
<prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
<prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop>
<prop key="net.sf.ehcache.configurationResourceName">${net.sf.ehcache.configurationResourceName}</prop>
<prop key="hibernate.cache.use_structured_entries">${hibernate.cache.use_structured_entries}</prop>
<prop key="hibernate.jdbc.use_scrollable_resultset">false</prop>
<prop key="hibernate.search.default.indexBase" >d:/JAVA/hibernateIndex</prop>
<prop key="hibernate.search.default.directory_provider">filesystem</prop>
<prop key="hibernate.search.default.locking_strategy">simple</prop>
<prop key="hibernate.search.worker.execution">async</prop>
<prop key="hibernate.search.worker.thread_pool.size">5</prop>
<prop key="hibernate.search.worker.buffer_queue.max">10000</prop>
<prop key="hibernate.search.default.exclusive_index_use">false</prop>
<prop key="hibernate.search.indexing_strategy">manual</prop>
</props>
</property>
</bean>
4、通过AbstractRoutingDataSource切换数据源
package hibernate;
import java.util.Map;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.jdbc.datasource.lookup.DataSourceLookup;
public class DynamicDataSource extends AbstractRoutingDataSource
{
public static String datasourcestr="dataSource";
@Override
protected Object determineCurrentLookupKey()
{
String datasource=CustomerContextHolder.getCustomerType();
System.out.println("数据源==="+datasource);
return datasource;
}
}
package hibernate;
public abstract class CustomerContextHolder
{
public final static String dataSource1 = "dataSource1";
public final static String dataSource2 = "dataSource2";
public final static String dataSource = "dataSource";
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static void setCustomerType(String customerType)
{
contextHolder.set(customerType);
}
public static String getCustomerType()
{
return contextHolder.get();
}
public static void clearCustomerType()
{
contextHolder.remove();
}
}
5、切换数据源
在业务代码中调用:CustomerContextHolder.setCustomerType("dataSource1");来实现数据源的切换
参考文档:
http://www.iteye.com/topic/1128861