有时候项目可能会连接到不同的数据库上获取数据,那么怎么才能自由切换,让代码查询想要的数据库呢,步骤如下
1,配置数据库连接信息
##第一个数据库信息 DB_MSSQL_URL_1=jdbc:mysql://127.0.0.1:3358/user_1?allowMultiQueries=true DB_MSSQL_DRIVER_1=com.mysql.jdbc.Driver DB_MSSQL_USER_1=root DB_MSSQL_PW_1=456 ##第二个数据库信息 DB_MSSQL_URL_2=jdbc:mysql://127.0.0.1:3358/user_2?allowMultiQueries=true DB_MSSQL_DRIVER_2=com.mysql.jdbc.Driver DB_MSSQL_USER_2=root DB_MSSQL_PW_2=123
2,创建数据库的bean
<!--第一数据库的信息--> <bean id="dataSource1" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>${DB_MSSQL_DRIVER_1}</value> </property> <property name="url"> <value>${DB_MSSQL_CMS_URL_1}</value> </property> <property name="username"> <value>${DB_MSSQL_USER_1}</value> </property> <property name="password"> <value>${DB_MSSQL_PW_1}</value> </property> </bean> <!--第二数据库的信息--> <bean id="dataSource2" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>${DB_MSSQL_DRIVER_2}</value> </property> <property name="url"> <value>${DB_MSSQL_CMS_URL_2}</value> </property> <property name="username"> <value>${DB_MSSQL_USER_2}</value> </property> <property name="password"> <value>${DB_MSSQL_PW_2}</value> </property> </bean>
3,创建类指定用哪个数据库
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(); } }
4,自定义动态数据源
public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DBContextHolder.getDbType(); } }
5,配置数据库连接池
<!-- 编写spring 配置文件的配置多数源映射关系 --> <bean class="com.lgg.utils.DynamicDataSource" id="dynamicDataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <entry value-ref="dataSource1" key="dataSource1"></entry> <entry value-ref="dataSource2" key="dataSource2"></entry> </map> </property> <property name="defaultTargetDataSource" ref="dataSource1"></property> </bean>
6,在java代码动态确定调用哪个数据库
public void getUserById(Integer id) { User user ; if(id == 1){ //调用数据库1 DBContextHolder.setDbType("dataSource1"); user = userDao.getUserById(1); }else{ //调用数据库2 DBContextHolder.setDbType("dataSource2"); user = userDao.getUserById(2); } return user; }