本篇文章为大家讲述我自己配置的双数据源过程,小伙伴们按照步骤一步一步按照文章所说便可完成多数据源的配置
步骤如下:
1:在pom中配置两个数据库的链接信息
<properties>
<p.package.suffix>dev</p.package.suffix>
<maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>
<!-- mysql -->
<p.jdbc.url>***********:3306</p.jdbc.url>
<p.jdbc.dbname>dbname</p.jdbc.dbname>
<p.jdbc.username>username</p.jdbc.username>
<p.jdbc.password>password</p.jdbc.password>
<p.c3p0.minPoolSize>2</p.c3p0.minPoolSize>
<p.c3p0.maxPoolSize>10</p.c3p0.maxPoolSize>
<p.c3p0.acquireIncrement>2</p.c3p0.acquireIncrement>
<p.c3p0.initialPoolSize>2</p.c3p0.initialPoolSize>
<!-- mongo -->
<p.mongo.url>*******</p.mongo.url>
<p.mongo.port>35010</p.mongo.port>
<p.mongo.dbname>dbname</p.mongo.dbname>
<p.mongo.username>username</p.mongo.username>
<p.mongo.password>username</p.mongo.password>
</properties>
2:数据源的配置文件dataSource.xml
<?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="description" value="DataSource for SkyCloudVNS" />
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="minPoolSize" value="${c3p0.minPoolSize}" />
<property name="maxPoolSize" value="${c3p0.maxPoolSize}" />
<property name="maxStatements" value="${c3p0.maxStatements}" />
<property name="initialPoolSize" value="${c3p0.initialPoolSize}" />
<property name="acquireIncrement" value="${c3p0.acquireIncrement}" />
<property name="maxIdleTime" value="${c3p0.maxIdleTime}" />
<property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}" />
<property name="preferredTestQuery" value="${c3p0.preferredTestQuery}" />
<property name="testConnectionOnCheckin" value="${c3p0.testConnectionOnCheckin}" />
</bean>
<bean id="dataSourceTwo" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="description" value="DataSource for SkyCloudVNS" />
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.urllog}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="minPoolSize" value="${c3p0.minPoolSize}" />
<property name="maxPoolSize" value="${c3p0.maxPoolSize}" />
<property name="maxStatements" value="${c3p0.maxStatements}" />
<property name="initialPoolSize" value="${c3p0.initialPoolSize}" />
<property name="acquireIncrement" value="${c3p0.acquireIncrement}" />
<property name="maxIdleTime" value="${c3p0.maxIdleTime}" />
<property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}" />
<property name="preferredTestQuery" value="${c3p0.preferredTestQuery}" />
<property name="testConnectionOnCheckin" value="${c3p0.testConnectionOnCheckin}" />
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="transactionManagerTwo" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceTwo" />
</bean>
<bean id="jdbcTemplateTwo" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSourceTwo" />
</bean>
<bean id="dynamicDataSource" class="com.yoyo.oss.common.utils.datasource.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<!-- 指定lookupKey和与之对应的数据源 -->
<entry key="dataSource" value-ref="dataSource"></entry>
<entry key="dataSourceTwo" value-ref="dataSourceTwo"></entry>
</map>
</property>
<!-- 这里可以指定默认的数据源 -->
<property name="defaultTargetDataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<tx:annotation-driven transaction-manager="transactionManagerTwo" />
</beans>
3:在applicationContext.xml中引用dataSource.xml
<import resource="classpath:/dataSource.xml" />
4:创建多数据源配置的工具类
package com.common.utils.datasource;
public class DynamicDataSourceHolder {
/**
* 数据源标识保存在线程变量中,避免多线程操作数据源时互相干扰
*/
private static final ThreadLocal<String> THREAD_DATA_SOURCE = new ThreadLocal<String>();
public static String getDataSource() {
return THREAD_DATA_SOURCE.get();
}
public static void setDataSource(String dataSource) {
THREAD_DATA_SOURCE.set(dataSource);
}
public static void clearDataSource() {
THREAD_DATA_SOURCE.remove();
}
}
package com.common.utils.datasource;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource{
@Override
protected Object determineCurrentLookupKey() {
// 从自定义的位置获取数据源标识
return DynamicDataSourceHolder.getDataSource();
}
}
5:在自己的dao中引用数据源
@Autowired private JdbcTemplate jdbcTemplate;
@Autowiredprivate JdbcTemplate jdbcTemplateTwo;
private static final BeanPropertyRowMapper<MyModel> rowMapper = new BeanPropertyRowMapper<MyModel>(
MyModel.class);
@Override
public List<MyModel> serch(String param) throws Exception{
DynamicDataSourceHolder.setDataSource("dataSourceTwo");//在此选择数据源,如果不做操作,默认数据源1(默认数据源在dataSource.xml中配置 )
String sql = "SELECT * from .....";
List<MyModel> myModels= new ArrayList<MyModel>();
myModels= jdbcTemplateTwo.query(sql, rowMapper, param);
return myModels;
}
至此双数据源生效正常使用,希望可以给小伙伴们解决一些问题。