JavaWEB项目之如何配置动态数据源
作者:hongmin.shm
这篇文章主要介绍了JavaWEB项目之如何配置动态数据源问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
JavaWEB项目配置动态数据源
说明
项目中如果需要连接多个数据库,则需要配置动态数据源,对于使用Spring+MyBatis框架的项目来说配置动态数据源一般需要在SqlMapConfig.xml中配置
接下来是配置步骤:
步骤
在配置JDBC连接的文件中配置动态数据源
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation=" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd" > <context:annotation-config/> <tx:annotation-driven transaction-manager="transactionManager"/> <!-- 引入配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:application.properties</value> </list> </property> </bean> <!--数据源一--> <bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="${jdbc1.driver}"/> <!-- 基本属性 url、user、password --> <property name="url" value="${jdbc1.url}"/> <property name="username" value="${jdbc1.username}"/> <property name="password" value="${jdbc1.password}"/> </bean> <!--数据源二--> <bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="${jdbc1.driver}"/> <!-- 基本属性 url、user、password --> <property name="url" value="${jdbc1.url}"/> <property name="username" value="${jdbc1.username}"/> <property name="password" value="${jdbc1.password}"/> </bean> <!--这里配置数据源管理工具类,自定义一个管理类用于设置以及获取当前数据源名称等操作,该类需要继承AbstractRoutingDataSource类并实现其中的抽象方法--> <bean id="dataSource" class="自定义DbcontrxtHolder类的全线名称(包名.类名)"> <!-- 设置默认数据源 --> <property name="defaultTargetDataSource" ref="dataSource1"/> <property name="targetDataSources"> <map> <!-- 配置数据源列表 key为切换数据源时所用的名称,value-ref为配置datasource的bean的id值 --> <entry key="dataSource1" value-ref="dataSource1"/> <entry key="dataSource2" value-ref="dataSource2"/> </map> </property> </bean> <!--后面配置事务等其他项,这里不再列出-->! </beans>
新建数据源管理工具DbcontrxtHolder类
package com.framework; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DbcontextHolder extends AbstractRoutingDataSource{ public static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); //添加动态数据源时指定名称,用于切换数据源时获取连接对象 其变量值为 targetDataSources键值 public static final String DATASOURCE1 = "dataSource1"; public static final String DATASOURCE2 = "dataSource2"; /** * 设置当前数据源 * @param dbType */ public static void setDbType(String dbType){ contextHolder.set(dbType); } /** * 获得当前数据源 * @return */ public static String getDbType(){ String dbType = (String)contextHolder.get(); return dbType; } /** *清除上下文 * */ public static void clearContext(){ contextHolder.remove(); } @Override protected Object determineCurrentLookupKey() { return DbcontextHolder.getDbType(); } }
在业务中切换数据源
public void test(){ ...业务代码 DbcontextHolder.setDbType(DbcontextHolder.DATASOURCE2);//切换数据源2 //保存信息当前数据源 if(!saveSendTaskSimple(sendTask)){ return false; } //清理上下文信息,恢复到默认数据源 DbcontextHolder.clearContext(); ...业务代码 }
web项目中配置多个数据源
spring + mybatis 多数据源配置有两种解决方案
1、配置多个不同的数据源,使用一个sessionFactory,在业务逻辑使用的时候自动切换到不同的数据源,有一个种是在拦截器里面根据不同的业务现切换到不同的datasource; 有的会在业务层根据业务来自动切换。
2、在spring项目中配置多个不同的数据源datasource,配置多个sqlSessionFactory,每个sqlSessionFactory对应一个datasource,在dao层根据不同业务自行选择使用哪个数据源的session来操作。
(一)定义数据源名称常量
public class DataSourceType { public static final String SOURCE_MYSQL = "mysql_dataSource"; public static final String SOURCE_POSTGS = "postgs_dataSource"; }
(二)创建负责切换数据源的类
public class DataSourceContextHolder { 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(); } }
(三) 建立动态数据源类
该类必须继承AbstractRoutingDataSource,且实现方法determineCurrentLookupKey
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource{ @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder. getDbType(); } }
(四)配置xml
<!-- 配置mysql --> <bean id="mysql_dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/colleges" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <!-- 配置postgs --> <bean id="postgs_dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="org.postgresql.Driver" /> <property name="url" value="jdbc:postgresql://114.215.83.3:5432/coges" /> <property name="username" value="postgres" /> <property name="password" value="postgres" /> </bean> <!-- 配置动态数据源 --> <bean id ="dataSource" class= "com.mote.dc.changedb.DynamicDataSource" > <property name ="targetDataSources"> <map key-type ="java.lang.String"> <entry value-ref ="postgs_dataSource" key= "postgs_dataSource"></entry > <entry value-ref ="mysql_dataSource" key= "mysql_dataSource"></entry > </map > </property> <!-- 默认使用mysql --> <property name ="defaultTargetDataSource" ref= "mysql_dataSource"></property > </bean>
(五)当需要使用某个数据库的时候
使用下面一行代码进行切换
//切换数据库 DataSourceContextHolder.setDbType(DataSourceType.SOURCE_POSTGS);
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。