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