SpringMVC配置多数据源sqlserver+mysql测试正常运行

前提:链接对应的数据库必须提前添加JAR包或者添加maven依赖。

第一步;在application.properties文件里面添加如下代码

#sqlserver连接

jdbc.test.url=jdbc:sqlserver://data.(你自己数据库地址).com:1433;database=database
jdbc.test.username=username
jdbc.test.password=password
#============================================================================
#sqlserver连接
#Mysqlconect
jdbc.local.mysql.driverClassName=com.mysql.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
jdbc.mysql.username=root
jdbc.mysql.password=123456

#数据源初始化通用配置

jdbc.initialPoolSize=3 
jdbc.maxPoolSize=20
jdbc.minPoolSize=3
jdbc.maxIdleTime=0
jdbc.acquireIncrement=5 
jdbc.maxStatements=3  
jdbc.idleConnectionTestPeriod=60

代码释义:application.properties文件里面存储的是以键对的形式存放,key=value形式,key命名是自定义的,主要以简洁明了为主,value必须以正确的形式填写,sqlserver填写sqlserver的url,

                  mysql填写mysql的url,驱动器以此类推,用户明和密码不用多说了。

第二步;applicationContext.xml中引入.properties文件如下代码,就可以在xml中用${key}替换指定的properties文件中的值,通常项目中都会将jdbc的配置放在properties文件中,在启动容器时,初始化bean时,${key}就会替换成properties文件中的值

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 <property name="locations">
   <list>
      <value>classpath:properties/*.properties</value>
    </list>
 </property>
 </bean>
 <bean id="dataSource" name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">  
        <!-- 指定连接数据库的驱动-->  
     <!--   <property name="driverClass" value="${jdbc.driverClassName}"/>  -->
        <!-- 指定连接池中保留的最大连接数. Default:15-->  
        <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>  
        <!-- 指定连接池中保留的最小连接数-->  
        <property name="minPoolSize" value="${jdbc.minPoolSize}"/>  
        <!-- 指定连接池的初始化连接数  取值应在minPoolSize 与 maxPoolSize 之间.Default:3-->  
        <property name="initialPoolSize" value="${jdbc.initialPoolSize}"/>  
        <!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。 Default:0-->  
        <property name="maxIdleTime" value="${jdbc.maxIdleTime}"/>  
        <!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数. Default:3-->  
        <property name="acquireIncrement" value="${jdbc.acquireIncrement}"/>  
        <!-- JDBC的标准,用以控制数据源内加载的PreparedStatements数量。  
             但由于预缓存的statements属于单个connection而不是整个连接池所以设置这个参数需要考虑到多方面的因数.
            如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default:0-->  
        <property name="maxStatements" value="${jdbc.maxStatements}"/>  
        <!-- 每60秒检查所有连接池中的空闲连接.Default:0 -->  
        <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"/>  
        <property name="testConnectionOnCheckout" value="true">   
</property>  
  <!-- dataSource配置 -->  
<bean id="fromDataSource" parent="dataSource">
    <property name="driverClass">
        <value>${jdbc.driverClassName}</value>
    </property>
    <property name="jdbcUrl">
           <value>${jdbc.from.url}</value>  
       </property>  
       <property name="user">  
           <value>${jdbc.from.username}</value>
       </property>  
       <property name="password">  
           <value>${jdbc.from.password}</value>
       </property>  
</bean>  
 <bean id="mysqlDataSource" parent="dataSource">
        <property name="driverClass">
            <value>${jdbc.local.mysql.driverClassName}</value>
        </property>
        <property name="jdbcUrl">
            <value>${jdbc.mysql.url}</value>
        </property>
        <property name="user">
            <value>${jdbc.mysql.username}</value>
        </property>
        <property name="password">
            <value>${jdbc.mysql.password}</value>
        </property>
    </bean>
    <!-- 动态DataSource配置 -->  
<bean id="dynamicDataSource" class="cn.com.(你自己包名).common.DynamicDataSource">  
    <property name="targetDataSources">  
        <map key-type="java.lang.String">  
            <entry key="testDataSource" value-ref="testDataSource"/>
            <entry key="mysqlDataSource" value-ref="mysqlDataSource"/>
        </map>  
    </property>  
<!--默认数据源设置-->
    <property name="defaultTargetDataSource" ref="testDataSource"/>  
</bean>
<!--数据源转换管理-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dynamicDataSource"/>
   </bean>
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>

基础配置完成了,接下来是代码和使用

第三步;这是一个本地线程,把数据源存放在线程里面,什么时候用什么时候取,不用了可以清除数据源。

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
 // 对应动态数据源配置中的key
   public static final String DATA_SOURCE_TEST = "testDataSource";
   public static final String DATA_SOURCE_MYSQL = "mysqlDataSource";
   // 本地线程,获取当前正在执行的currentThreadmysqlDataSource
   public static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

   public static void setCustomerType(String customerType) {

      contextHolder.set(customerType);

   }

   public static String getCustomerType() {
      return contextHolder.get();
   }

   public static void clearCustomerType() {
      contextHolder.remove();
   }

   @Override
   protected Object determineCurrentLookupKey() {
      return getCustomerType();
   }

第四步;代码测试和切换数据源    
   //先清除一下数据源,防止数据源重复加载
   DynamicDataSource.clearCustomerType();
   //使用我的mysql数据源
   DynamicDataSource.setCustomerType(DynamicDataSource.DATA_SOURCE_MYSQL)

执行结果:信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource@69653e16[ acquireIncrement -> 5, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, description -> null, driverClass -> com.microsoft.sqlserver.jdbc.SQLServerDriver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 69653e16, idleConnectionTestPeriod -> 60, initialPoolSize -> 3, jdbcUrl -> jdbc:sqlserver://data.xxxxx.com:1433;database=localerp, loginTimeout -> 0, maxIdleTime -> 0, maxPoolSize -> 20, maxStatements -> 3, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, properties -> {password=******, user=******}, propertyCycle -> 300, testConnectionOnCheckin -> false, testConnectionOnCheckout -> true, usesTraditionalReflectiveProxies -> false ]

以上是数据库初始化成功了

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值