1. 程式人生 > >Spring3 整合MyBatis3 配置多數據源 動態選擇SqlSessionFactory(轉)

Spring3 整合MyBatis3 配置多數據源 動態選擇SqlSessionFactory(轉)

poi lba == lan bat load -o esp int

1. Spring整合MyBatis切換SqlSessionFactory有兩種方法,第一、 繼承SqlSessionDaoSupport,重寫獲取SqlSessionFactory的方法。第二、繼承SqlSessionTemplate 重寫getSqlSessionFactory、getConfiguration和SqlSessionInterceptor這個攔截器。其中最為關鍵還是繼承SqlSessionTemplate 並重寫裏面的方法。

我們一般使用第二種方法,第二種方法有2 種配置:

單個sqlSessionFactory情況:需要在程序中(action 裏面動態指定使用那個數據庫連接池)

spring-mybatis.xml配置如下:

[java] view plain copy print?
  1. <!-- ========================================配置數據源========================================= -->
  2. <!-- 配置數據源,使用的是alibaba的Druid(德魯伊)數據源 -->
  3. <bean name="pepos" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"
    destroy-method="close">
  4. <property name="url" value="${pepos.url}" />
  5. <property name="username" value="${pepos.username}" />
  6. <property name="password" value="${pepos.password}" />
  7. <!-- 密碼解密-->
  8. <property name="filters" value="config" />
  9. <property name="connectionProperties"
    value="config.decrypt=true;config.decrypt.key=${pepos.publickey}" />
  10. <!-- 初始化連接大小 -->
  11. <property name="initialSize" value="0" />
  12. <!-- 連接池最大使用連接數量 -->
  13. <property name="maxActive" value="20" />
  14. <!-- 連接池最大空閑 <property name="maxIdle" value="20" /> -->
  15. <!-- 連接池最小空閑 -->
  16. <property name="minIdle" value="0" />
  17. <!-- 獲取連接最大等待時間 -->
  18. <property name="maxWait" value="60000" />
  19. <!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
  20. <property name="poolPreparedStatements" value="true" />
  21. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
  22. <property name="validationQuery" value="SELECT 1" />
  23. <property name="testOnBorrow" value="false" />
  24. <property name="testOnReturn" value="false" />
  25. <property name="testWhileIdle" value="true" />
  26. <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
  27. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  28. <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
  29. <property name="minEvictableIdleTimeMillis" value="25200000" />
  30. <!-- 打開removeAbandoned功能 -->
  31. <property name="removeAbandoned" value="true" />
  32. <!-- 1800秒,也就是30分鐘 -->
  33. <property name="removeAbandonedTimeout" value="1800" />
  34. <!-- 關閉abanded連接時輸出錯誤日誌 -->
  35. <property name="logAbandoned" value="true" />
  36. </bean>
  37. <!-- 配置數據源,使用的是alibaba的Druid(德魯伊)數據源 -->
  38. <bean name="payment" class="com.alibaba.druid.pool.DruidDataSource"
  39. init-method="init" destroy-method="close">
  40. <property name="url" value="${payment.url}" />
  41. <property name="username" value="${payment.username}" />
  42. <property name="password" value="${payment.password}" />
  43. <!-- 密碼解密 -->
  44. <property name="filters" value="config" />
  45. <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${payment.publickey}" />
  46. <!-- 初始化連接大小 -->
  47. <property name="initialSize" value="0" />
  48. <!-- 連接池最大使用連接數量 -->
  49. <property name="maxActive" value="20" />
  50. <!-- 連接池最大空閑 <property name="maxIdle" value="20" /> -->
  51. <!-- 連接池最小空閑 -->
  52. <property name="minIdle" value="0" />
  53. <!-- 獲取連接最大等待時間 -->
  54. <property name="maxWait" value="60000" />
  55. <!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
  56. <property name="poolPreparedStatements" value="true" />
  57. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
  58. <property name="validationQuery" value="SELECT 1" />
  59. <property name="testOnBorrow" value="false" />
  60. <property name="testOnReturn" value="false" />
  61. <property name="testWhileIdle" value="true" />
  62. <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
  63. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  64. <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
  65. <property name="minEvictableIdleTimeMillis" value="25200000" />
  66. <!-- 打開removeAbandoned功能 -->
  67. <property name="removeAbandoned" value="true" />
  68. <!-- 1800秒,也就是30分鐘 -->
  69. <property name="removeAbandonedTimeout" value="1800" />
  70. <!-- 關閉abanded連接時輸出錯誤日誌 -->
  71. <property name="logAbandoned" value="true" />
  72. </bean>
  73. <!-- 需要基礎spring的 AbstractRoutingDataSource 來實現動態設置數據庫連接池 -->
  74. <bean id="dynamicDataSource" class="com.threeweidu.mallmanage.utils.DynamicDataSource">
  75. <property name="targetDataSources">
  76. <map key-type="java.lang.String">
  77. <entry value-ref="pepos" key="pepos"></entry>
  78. <entry value-ref="payment" key="payment"></entry>
[java] view plain copy print?
  1. </map>
  2. </property>
  3. <property name="defaultTargetDataSource" ref="pepos">
  4. </property>
  5. </bean>
  6. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  7. <property name="dataSource" ref="dynamicDataSource"></property>
  8. </bean>
  9. <!-- MyBatis配置 -->
  10. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  11. <property name="dataSource" ref="dynamicDataSource" />
  12. <!-- 自動掃描entity目錄, 省掉Configuration.xml裏的手工配置 -->
  13. <property name="typeAliasesPackage" value="com.threeweidu.mallmanage.entity" />
  14. <!-- 顯式指定Mapper文件位置 -->
  15. <property name="mapperLocations" value="classpath:/com/threeweidu/mallmanage/dao/mybatis/mapper/*Mapper.xml" />
  16. </bean>
  17. <!-- 配置掃描器 -->
  18. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  19. <!-- 掃描me.gacl.dao這個包以及它的子包下的所有映射接口類 -->
  20. <property name="basePackage" value="com.threeweidu.mallmanage.dao.mybatis" />
  21. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
  22. </bean>
  23. <!-- 配置Spring的事務管理器 -->
  24. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  25. <property name="dataSource" ref="dynamicDataSource" />
  26. </bean>
  27. <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
  28. <!-- 攔截器方式配置事務 -->
  29. <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
  30. <tx:attributes>
  31. <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
  32. <tx:method name="find*" propagation="REQUIRED" read-only="true"/>
  33. <tx:method name="load*" propagation="REQUIRED" read-only="true"/>
  34. <tx:method name="init*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  35. <tx:method name="save*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  36. <tx:method name="add*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  37. <tx:method name="register*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  38. <tx:method name="update*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  39. <tx:method name="delete*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  40. <tx:method name="remove*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  41. <tx:method name="*" propagation="SUPPORTS" />
  42. </tx:attributes>
  43. </tx:advice>
  44. <aop:config>
  45. <aop:pointcut id="transactionPointcut" expression="execution(* com.threeweidu.mallmanage.service..*Impl.*(..))"/>
  46. <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice"/>
  47. </aop:config>
  48. lt;/beans>


多個sqlsessionFactroy 模式

spring-mybatis.xml 配置文件

[java] view plain copy print?
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  8. http://www.springframework.org/schema/tx
  9. http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
  12. ">
  13. <import resource="spring-mybatis-shop.xml" />
  14. <import resource="spring-mybatis-payment.xml" />
  15. <!--
  16. <import resource="spring-mybatis-pepos.xml" />
  17. <import resource="spring-mybatis-peposlog.xml" />
  18. <import resource="spring-mybatis-peposchat.xml" />
  19. <import resource="spring-mybatis-vaservice.xml" />
  20. -->
  21. </beans>

spring-mybatis-payment.xml 配置

[java] view plain copy print?
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  8. http://www.springframework.org/schema/tx
  9. http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
  12. ">
  13. <!-- 數據庫連接池 -->
  14. <bean id="dataSource_payment" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  15. <property name="url" value="${payment.url}" />
  16. <property name="username" value="${payment.username}" />
  17. <property name="password" value="${payment.password}" />
  18. <!-- 密碼解密 -->
  19. <property name="filters" value="config" />
  20. <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${payment.publickey}" />
  21. <!-- 初始化連接大小 -->
  22. <property name="initialSize" value="3" />
  23. <!-- 連接池最大使用連接數量 -->
  24. <property name="maxActive" value="200" />
  25. <!-- 連接池最大空閑 <property name="maxIdle" value="20" /> -->
  26. <!-- 連接池最小空閑 -->
  27. <property name="minIdle" value="0" />
  28. <!-- 獲取連接最大等待時間 -->
  29. <property name="maxWait" value="60000" />
  30. <!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
  31. <property name="poolPreparedStatements" value="true" />
  32. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
  33. <property name="validationQuery" value="SELECT 1" />
  34. <property name="testOnBorrow" value="false" />
  35. <property name="testOnReturn" value="false" />
  36. <property name="testWhileIdle" value="true" />
  37. <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
  38. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  39. <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
  40. <property name="minEvictableIdleTimeMillis" value="25200000" />
  41. <!-- 打開removeAbandoned功能 -->
  42. <property name="removeAbandoned" value="true" />
  43. <!-- 1800秒,也就是30分鐘 -->
  44. <property name="removeAbandonedTimeout" value="1800" />
  45. <!-- 關閉abanded連接時輸出錯誤日誌 -->
  46. <property name="logAbandoned" value="true" />
  47. </bean>
  48. <!-- MyBatis配置 -->
  49. <bean id="sqlSessionFactory_payment" class="org.mybatis.spring.SqlSessionFactoryBean">
  50. <property name="dataSource" ref="dataSource_payment" />
  51. <!-- 自動掃描entity目錄, 省掉Configuration.xml裏的手工配置 -->
  52. <property name="typeAliasesPackage" value="com.threeweidu.supplier.entity" />
  53. <!-- 顯式指定Mapper文件位置 -->
  54. <property name="mapperLocations" value="classpath:/com/threeweidu/supplier/dao/mybatis/payment/mapper/*Mapper.xml" />
  55. </bean>
  56. <!-- 配置掃描器 -->
  57. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  58. <!-- 掃描me.gacl.dao這個包以及它的子包下的所有映射接口類 -->
  59. <property name="basePackage" value="com.threeweidu.supplier.dao.mybatis.payment" />
  60. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_payment" />
  61. </bean>
  62. <!-- 配置Spring的事務管理器 -->
  63. <bean id="transactionManager_payment" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  64. <property name="dataSource" ref="dataSource_payment" />
  65. </bean>
  66. <tx:annotation-driven transaction-manager="transactionManager_payment" proxy-target-class="true" />
  67. <!-- 攔截器方式配置事務 -->
  68. <tx:advice id="transactionAdvice_payment" transaction-manager="transactionManager_payment">
  69. <tx:attributes>
  70. <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
  71. <tx:method name="find*" propagation="REQUIRED" read-only="true"/>
  72. <tx:method name="load*" propagation="REQUIRED" read-only="true"/>
  73. <tx:method name="init*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  74. <tx:method name="save*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  75. <tx:method name="add*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  76. <tx:method name="register*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  77. <tx:method name="update*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  78. <tx:method name="delete*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  79. <tx:method name="remove*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  80. <tx:method name="*" propagation="SUPPORTS" />
  81. </tx:attributes>
  82. </tx:advice>
  83. <aop:config>
  84. <aop:advisor advice-ref="transactionAdvice_payment" pointcut="execution(* com.threeweidu.supplier.service..*Impl.*(..))" />
  85. </aop:config>
  86. </beans>


參考:http://blog.csdn.net/xingxiupaioxue/article/details/51094091

Spring3 整合MyBatis3 配置多數據源 動態選擇SqlSessionFactory(轉)