java设置多个数据源

更新时间:2018-06-21 11:21:51点击次数:960次

1、设置config.properties文件,设置两个数据库连接

2、设置spring-context.xml文件,定义名为testDataSource和dataSource两个连接

[html] view plain copy
  1. <!-- 测试库 -->  
  2.     <bean id="testDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">    
  3.         <!-- 基本属性 url、user、password -->  
  4.         <property name="name" value="testDataSource"/>  
  5.         <property name="driverClassName" value="${jdbc.test.driverClassName}" />  
  6.         <property name="url" value="${jdbc.test.url}" />  
  7.         <property name="username" value="${jdbc.test.username}" />  
  8.         <property name="password" value="${jdbc.test.password}" />  
  9.   
  10.         <!-- 配置初始化大小、小、大 -->  
  11.         <property name="initialSize" value="${jdbc.initialSize}" />  
  12.         <property name="minIdle" value="${jdbc.minIdle}" />  
  13.         <property name="maxActive" value="${jdbc.maxActive}" />  
  14.         <!-- 配置获取连接等待时的时间 -->  
  15.         <property name="maxWait" value="${jdbc.maxWait}" />  
  16.         <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->  
  17.         <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />  
  18.         <!-- 配置一个连接在池中小生存的时间,单位是毫秒 -->  
  19.         <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" />  
  20.   
  21. <!--         <property name="validationQuery" value="${jdbc.validationQuery}" /> -->  
  22.         <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />  
  23.         <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />  
  24.         <property name="testOnReturn" value="${jdbc.testOnReturn}" />  
  25.   
  26.         <!-- 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。   
  27.             如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。分库分表较多的数据库,建议配置为false。 -->  
  28.         <property name="poolPreparedStatements" value="${jdbc.poolPreparedStatements}" />  
  29.         <!-- 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 -->  
  30.         <property name="maxPoolPreparedStatementPerConnectionSize"  
  31.             value="${jdbc.maxPoolPreparedStatementPerConnectionSize}" />  
  32.   
  33.         <!-- 配置监控统计拦截的filters mergeStat 将相同的sql语句合并成一条 -->  
  34.         <property name="filters" value="${jdbc.filters}" />  
  35.         <property name="proxyFilters">  
  36.             <list>  
  37.                 <ref bean="stat-filter" />  
  38.             </list>  
  39.         </property>  
  40.           
  41.         <!-- 缺省多个DruidDataSource的监控数据是各自独立的,在Druid-0.2.17版本之后,支持配置公用监控数据,配置参数为useGloalDataSourceStat -->  
  42.         <property name="useGlobalDataSourceStat" value="true" />  
  43.   
  44.         <!-- 配置removeAbandoned对性能会有一些影响,建议怀疑存在泄漏之后再打开。在上面的配置中,如果连接过30分钟未关闭,就会被强行回收,并且日志记录连接申请时的调用堆栈。 -->  
  45.         <!-- 打开removeAbandoned功能 -->  
  46.         <property name="removeAbandoned" value="${jdbc.removeAbandoned}" />  
  47.         <!-- 1800秒,也就是30分钟 -->  
  48.         <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" />  
  49.         <!-- 关闭abanded连接时输出错误日志 -->  
  50.         <property name="logAbandoned" value="${jdbc.logAbandoned}" />  
  51.     </bean>    
  52.       
  53.     <!-- 正式库 -->  
  54.     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">    
  55.         <!-- 基本属性 url、user、password -->  
  56.         <property name="name" value="dataSource"/>  
  57.         <property name="driverClassName" value="${jdbc.driverClassName}" />  
  58.         <property name="url" value="${jdbc.url}" />  
  59.         <property name="username" value="${jdbc.username}" />  
  60.         <property name="password" value="${jdbc.password}" />  
  61.   
  62.         <!-- 配置初始化大小、小、大 -->  
  63.         <property name="initialSize" value="${jdbc.initialSize}" />  
  64.         <property name="minIdle" value="${jdbc.minIdle}" />  
  65.         <property name="maxActive" value="${jdbc.maxActive}" />  
  66.         <!-- 配置获取连接等待时的时间 -->  
  67.         <property name="maxWait" value="${jdbc.maxWait}" />  
  68.         <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->  
  69.         <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />  
  70.         <!-- 配置一个连接在池中小生存的时间,单位是毫秒 -->  
  71.         <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" />  
  72.   
  73. <!--         <property name="validationQuery" value="${jdbc.validationQuery}" /> -->  
  74.         <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />  
  75.         <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />  
  76.         <property name="testOnReturn" value="${jdbc.testOnReturn}" />  
  77.   
  78.         <!-- 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。   
  79.             如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。分库分表较多的数据库,建议配置为false。 -->  
  80.         <property name="poolPreparedStatements" value="${jdbc.poolPreparedStatements}" />  
  81.         <!-- 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 -->  
  82.         <property name="maxPoolPreparedStatementPerConnectionSize"  
  83.             value="${jdbc.maxPoolPreparedStatementPerConnectionSize}" />  
  84.   
  85.         <!-- 配置监控统计拦截的filters mergeStat 将相同的sql语句合并成一条 -->  
  86.         <property name="filters" value="${jdbc.filters}" />  
  87.         <property name="proxyFilters">  
  88.             <list>  
  89.                 <ref bean="stat-filter" />  
  90.             </list>  
  91.         </property>  
  92.           
  93.         <!-- 缺省多个DruidDataSource的监控数据是各自独立的,在Druid-0.2.17版本之后,支持配置公用监控数据,配置参数为useGloalDataSourceStat -->  
  94.         <property name="useGlobalDataSourceStat" value="true" />  
  95.   
  96.         <!-- 配置removeAbandoned对性能会有一些影响,建议怀疑存在泄漏之后再打开。在上面的配置中,如果连接过30分钟未关闭,就会被强行回收,并且日志记录连接申请时的调用堆栈。 -->  
  97.         <!-- 打开removeAbandoned功能 -->  
  98.         <property name="removeAbandoned" value="${jdbc.removeAbandoned}" />  
  99.         <!-- 1800秒,也就是30分钟 -->  
  100.         <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" />  
  101.         <!-- 关闭abanded连接时输出错误日志 -->  
  102.         <property name="logAbandoned" value="${jdbc.logAbandoned}" />  
  103.     </bean>    
  104.   
  105.     <bean id="multipleDataSource" class="com.huaxiapawn.util.MultipleDataSource">  
  106.         <property name="defaultTargetDataSource" ref="testDataSource"/>  
  107.         <property name="targetDataSources">  
  108.             <map>  
  109.                 <entry key="testDataSource" value-ref="testDataSource"/>  
  110.                 <entry key="dataSource" value-ref="dataSource" />  
  111.             </map>  
  112.         </property>  
  113.     </bean>  

3、新建MultipleDataSource.java文件,代码如下:

[java] view plain copy
  1. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;  
  2.   
  3. public class MultipleDataSource extends AbstractRoutingDataSource{  
  4.     private static final ThreadLocal<String> dataSourceKey = new InheritableThreadLocal<String>();  
  5.       
  6.     public static void setDataSourceKey(String dataSource) {  
  7.         dataSourceKey.set(dataSource);  
  8.     }  
  9.       
  10.     @Override  
  11.     protected Object determineCurrentLookupKey() {  
  12.         return dataSourceKey.get();  
  13.     }  
  14.   
  15. }  

4、新建DataSourceUtil.java数据库连接工具,根据需要选择连接的数据库,代码如下:

[java] view plain copy
  1. public class DataSourceUtil {  
  2.   
  3.     // 测试库  
  4.     public static void selectTestDataSource() {  
  5.         MultipleDataSource.setDataSourceKey("testDataSource");  
  6.     }  
  7.       
  8.     // 正式库  
  9.     public static void selectDataSource() {  
  10.         MultipleDataSource.setDataSourceKey("dataSource");  
  11.     }  
  12. }  

5、在dao层调用时,动态选择调用的库即可

[java] view plain copy
  1. DataSourceUtil.selectDataSource();  
  2. // 下面是要执行的sql语句  

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息