SpringMVC 中xml 配置多数据源
1,配置jdbc.properties
jdbc.driver_one=... jdbc.url_one=..... jdbc.username_one=... jdbc.password_one=.. jdbc.driver_two=... jdbc.url_two=..... jdbc.username_two=... jdbc.password_two=.. jdbc.initialSize=..... jdbc.maxActive=.... .....
2,数据源xml 配置
... <!-- 读取配置文件信息 --> <context:property-placeholder ignore-unresolvable="true" location="classpath:*.properties"/> <bean name="dataSource" class="com.hsq.datasource.MultipleDataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <entry key="dataSource_one" value-ref="dataSource_one" /> <entry key="dataSource_two" value-ref="dataSource_two" /> </map> </property> <!-- 配置默认数据源1--> <property name="defaultTargetDataSource" ref="dataSource_one" /> </bean> <bean id="dataSource_one" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 数据库基本配置 --> <property name="driverClassName" value="${jdbc.driver_one}" /> <property name="url" value="${jdbc.url_one}" /> <property name="username" value="${jdbc.username_one}" /> <property name="password" value="${jdbc.password_one}" /> <!-- 初始化连接数量 --> <property name="initialSize" value="${jdbc.initialSize}"/> <!-- 最大并发连接数量 --> <property name="maxActive" value="${jdbc.maxActive}"/> <!-- 最小空闲连接数 --> <property name="minIdle" value="${jdbc.minIdle}"/> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="${jdbc.maxWait}" /> <!-- 超过时间限制是否回收 --> <property name="removeAbandoned" value="${jdbc.removeAbandoned}" /> <!-- 超过时间限制多长 --> <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" /> <!-- 用来检测连接是否有效的sql,要求是一个查询语句--> <property name="validationQuery" value="${jdbc.validationQuery}" /> <!-- 申请连接的时候检测 --> <property name="testWhileIdle" value="${jdbc.testWhileIdle}" /> <!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 --> <property name="testOnBorrow" value="${jdbc.testOnBorrow}" /> <!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 --> <property name="testOnReturn" value="${jdbc.testOnReturn}" /> <property name="logAbandoned" value="true" /> <!-- 配置监控统计拦截的filters,wall用于防止sql注入,stat用于统计分析 --> <property name="filters" value="stat,log4j" /> </bean> <bean id="dataSource_two" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 数据库基本配置 --> <property name="driverClassName" value="${jdbc.driver_two}" /> <property name="url" value="${jdbc.url_two}" /> <property name="username" value="${jdbc.username_two}" /> <property name="password" value="${jdbc.password_two}" /> <!-- 初始化连接数量 --> <property name="initialSize" value="${jdbc.initialSize}"/> <!-- 最大并发连接数量 --> <property name="maxActive" value="${jdbc.maxActive}"/> <!-- 最小空闲连接数 --> <property name="minIdle" value="${jdbc.minIdle}"/> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="${jdbc.maxWait}" /> <!-- 超过时间限制是否回收 --> <property name="removeAbandoned" value="${jdbc.removeAbandoned}" /> <!-- 超过时间限制多长 --> <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" /> <!-- 用来检测连接是否有效的sql,要求是一个查询语句--> <property name="validationQuery" value="${jdbc.validationQuery}" /> <!-- 申请连接的时候检测 --> <property name="testWhileIdle" value="${jdbc.testWhileIdle}" /> <!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 --> <property name="testOnBorrow" value="${jdbc.testOnBorrow}" /> <!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 --> <property name="testOnReturn" value="${jdbc.testOnReturn}" /> <property name="logAbandoned" value="true" /> <!-- 配置监控统计拦截的filters,wall用于防止sql注入,stat用于统计分析 --> <property name="filters" value="stat,log4j" /> </bean> ...
3.用枚举类列举数据源:
public enum DbSource { one("dataSource_one"), two("dataSource_two"); private String value; DbSource(String value) { this.value = value; } public String getValue() { return value; } pulic void setValue(){ this.value = value; } }
4.数据源配置
/** * 配置mybatis多数据源,使用 MultipleDataSource.setDataSourceKey("") 配置数据源 * */ public class MultipleDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<String> dataSourceKey = new InheritableThreadLocal<String>(); public static void setDataSourceKey(String dataSource) { dataSourceKey.set(dataSource); } public static String getDataSourceKey() { return dataSourceKey.get(); } @Override protected Object determineCurrentLookupKey() { return dataSourceKey.get(); } }
5,切换方式
try { MultipleDataSource.setDataSourceKey(DbSource.two.getValue()); ...... } finally { MultipleDataSource.setDataSourceKey(DbSource.one.getValue()); }