spring动态数据源配置

原创
2015/05/07 12:03
阅读数 202

在项目中出于某种目的使用了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;
        }
    });
}

完毕。

展开阅读全文
打赏
0
9 收藏
分享
加载中
更多评论
打赏
0 评论
9 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部