一次Spring多數據源遇到的坑


一、出現的問題

由於業務需要,項目中配置了2個數據庫的數據源.

可是執行的時候,總是出現第二個數據源使用的mapper報錯.

理論上是應該訪問 db_2.table 卻總是提示 db_1.table 不存在.

使用的數據鏈接池為 Proxool

二、解決的辦法

1.兩個數據源的class設置為不同的類,就可以解決了,例如:

<bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource">

<bean id="dataSource2" class="org.logicalcobwebs.proxool.ProxoolDataSource">

2.添加<property name="alias" value="xxxx" /> 來區分兩個數據鏈接源

三、框架和配置

1.使用的框架: Spring 4.3.3.RELEASE + mybatis 3.3.1 + proxool 0.9.1

2.配置文件

 1 <!- 連接數據庫1 ->
 2 <bean id="dataSource_1" class="org.logicalcobwebs.proxool.ProxoolDataSource">
 3     <property name="driver" value="com.mysql.jdbc.Driver" />
 4     <property name="driverUrl" value="jdbc:mysql://127.0.0.1:3306/db1" />
 5     <property name="user" value="root" />
 6     <property name="password" value="root" />
 7 </bean>
 8 
 9 <bean id="sqlSessionFactory_1" class="org.mybatis.spring.SqlSessionFactoryBean" >
10     <property name="dataSource" ref="dataSource_1" />
11     <property name="mapperLocations" value="classpath:com/project1/*/mapper/*.xml"></property>
12 </bean>
13 
14 <bean id="mapperScannerConfigurer_1" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
15     <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_1"></property>
16     <property name="basePackage" value="com.project1.*.mapper" />
17 </bean>
18 
19 <bean id="transactionManager_1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
20     <property name="dataSource" ref="dataSource_1" />
21 </bean>
22 
23 <!- 連接數據庫2 ->
24 <bean id="dataSource_2" class="org.logicalcobwebs.proxool.ProxoolDataSource">
25     <property name="driver" value="com.mysql.jdbc.Driver" />
26     <property name="driverUrl" value="jdbc:mysql://127.0.0.1:3306/db2" />
27     <property name="user" value="root" />
28     <property name="password" value="root" />
29 </bean>
30 
31 <bean id="sqlSessionFactory_2" class="org.mybatis.spring.SqlSessionFactoryBean" >
32     <property name="dataSource" ref="dataSource_2" />
33     <property name="mapperLocations" value="classpath:com/project2/*/mapper/*.xml"></property>
34 </bean>
35 
36 <bean id="mapperScannerConfigurer_2" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
37     <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_2"></property>
38     <property name="basePackage" value="com.project2.*.mapper" />
39 </bean>
40 
41 <bean id="transactionManager_2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
42     <property name="dataSource" ref="dataSource_2" />
43 </bean>
數據庫配置.xml

 四、問題解決過程

1.debug跟蹤運行情況

來查找為什么第二個數據庫的操作類 mapper 不能正確的鏈接到第一個數據庫中

2.google查一下

發現不少數同樣的問題,但是參考了下,都無法解決,

在Mybatis-spring中由於默認Autowired導致不能配置多個數據源的問題分析及解決

3.開發工具查看Bean

我是用的是STS(Spring Tool Suite) 一個Spring 官方出的帶插件的Eclipse,網址 http://spring.io/tools/sts

它里面有一個選項卡是Spring Explorer

通過這個選項卡,我發現datasource只有一個,可是明明寫了2個啊 id還不一樣

所以我嘗試修改第二個datasource的class為 org.springframework.jdbc.datasource.DriverManagerDataSource 

項目跑起來,不報錯了,所以

不同的<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"> 

如果class都是org.logicalcobwebs.proxool.ProxoolDataSource 是不起作用的

五、后續發現

1.再次通過查看源代碼的方式,查看ProxoolDataSource getConnection() 方法

發現了 如果alias不存在,才會調用registerPool(),

是否存在調用的是,也就是一個一個map的key是否存在,

果斷debug查看下 如果不給alias屬性時候的情況,是null

所以才會出現兩個都是ProxoolDataSource的時候,第二個總是使用第一個,

所以還可以通過給兩個添加<property name="alias" value="xxxx" />來使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM