spring多数据源的配置和使用

来源:互联网 发布:网络吸毒聊天室 编辑:程序博客网 时间:2024/06/05 15:32

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

步骤如下:

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中引用数据源

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




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


原创粉丝点击