spring多数据源的配置和使用

本篇文章为大家讲述我自己配置的双数据源过程,小伙伴们按照步骤一步一步按照文章所说便可完成多数据源的配置

步骤如下:

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;
    }






至此双数据源生效正常使用,希望可以给小伙伴们解决一些问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值