hibernate4+spring实现多数据源切换

这两天一直在测试多数据源切换,在网上找了好多代码,自己也测试了好多遍,就是实现不了,结果发现是数据源里的连接池的问题。

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>

3sessionFactory及事务的配置

<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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值