spring动态数据源配置

在项目中出于某种目的使用了2个数据源,分别在不同的物理主机上,增删改使用server1数据源,查询使用server2数据源。

通过AbstractRoutingDataSource实现多数据源的配置。

步骤:

1. 在spring的配置文件如下配置[application-context.xml]:

主要配置2个数据源ds1和ds2,用到的时候进行切换

<!-- 配置数据源  -->
    <bean id="dataSource" class="com.xxx.DynamicDataSource">  
        <property name="targetDataSources">  
            <map key-type="java.lang.String">  
                <entry key="1" value-ref="ds1"/>  
                <entry key="2" value-ref="ds2"/> 
            </map>  
        </property>  
        <property name="defaultTargetDataSource" ref="ds1"/>  
    </bean>
<!-- 数据源配置 ,项目用了bonecp数据源,这里也可以配置c3p0数据源-->
 <bean id="ds1" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
     <property name="driverClass" value="com.mysql.jdbc.Driver" />
     。。。中间配置略过
   </bean>
   <bean id="ds2" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
     <property name="driverClass" value="com.mysql.jdbc.Driver" />
   </bean>

2. 其中com.xxx.DynamicDataSource是重写了方法AbstractRoutingDataSource

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        // TODO Auto-generated method stub
        return DbContextHolder.getDbType();  
    }
}

3. 数据源控制方法[用来更改数据源]:

public class DbContextHolder{
     private static final ThreadLocal contextHolder = new ThreadLocal();    
     public static void setDbType(String dbType) {    
         contextHolder.set(dbType);   
     }      
     public static String getDbType() {    
         String str=(String) contextHolder.get();
         if(null==str || "".equals(str))
             str="1";
         return str;   
     }    
     public static void clearDbType() {    
         contextHolder.remove();   
     }  
}

4. 在实际增删改查中使用:

查询

public int getNum() {
    int num=0;
    DbContextHolder.setDbType("2");//更换数据源
    String hql="select count(a.id) from table a where a.id>0 ";		    
    List lt = getHibernateTemplate().find(hql);
    return num;
}

修改

public boolean deletePic(final long id,final String pic){
    DbContextHolder.setDbType("1");
    return (Boolean)getHibernateTemplate().execute(
    new HibernateCallback() {
        public Object doInHibernate(Session session)throws HibernateException, SQLException {
            String hql="update TAdLaunch set imgUrl=replace(imgUrl,:pic,:nn) where id=:id";
            Query qq = session.createQuery(hql);
            qq.setLong("id", id);
            qq.setString("pic", pic);
            qq.setString("nn", "");
            qq.executeUpdate();
            return true;
        }
    });
}

完毕。

转载于:https://my.oschina.net/tulongx/blog/411722

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值