1.在spring配置文件中配置
<!--第一个数据源--> <!-- 配置c3p0 数据源 --> <bean id="dataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}"></property> <property name="jdbcUrl" value="${jdbc.url}"></property> <property name="user" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean> <!-- 配置事务管理器 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 这里可以指定默认的数据源 --> <property name="dataSource" ref="dataSource1"></property> </bean> <!--第2个数据源--> <!--配置c3p0 数据源2 --> <bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc2.driver}"></property> <property name="jdbcUrl" value="${jdbc2.url}"></property> <property name="user" value="${jdbc2.username}"></property> <property name="password" value="${jdbc2.password}"></property> </bean> <!-- 配置事务管理器 --> <bean id="txManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 这里可以指定默认的数据源 --> <property name="dataSource" ref="dataSource2"></property> </bean> <!-- 下面的是切换数据库的自定义类,配置文件的配置多数源映射关系 --> <bean id="multipleDataSource" class="com.pdzx.util.DynamicDataSource"> <property name="defaultTargetDataSource" ref="dataSource1"></property> <property name="targetDataSources"> <map> <entry key="dataSource1" value-ref="dataSource1"></entry> <entry key="dataSource2" value-ref="dataSource2"></entry> </map> </property> </bean>
2.继承AbstractRoutingDataSource
public class DBContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setDbType(String dbType) { contextHolder.set(dbType); } public static String getDbType() { return ((String) contextHolder.get()); } public static void clearDbType() { contextHolder.remove(); } }
public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DBContextHolder.getDbType(); } }
3.切换数据库
//指定数据库 DBContextHolder.setDbType("dataSource1");