一次Spring多数据源遇到的坑(转载)

时间:2024-04-05 11:08:26

转自 http://www.cnblogs.com/javayu/p/6221586.html

一、出现的问题

由于业务需要,项目中配置了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.配置文件

一次Spring多数据源遇到的坑(转载)
一次Spring多数据源遇到的坑(转载)
 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>
一次Spring多数据源遇到的坑(转载)

 四、问题解决过程

1.debug跟踪运行情况

来查找为什么第二个数据库的操作类 mapper 不能正确的链接到第一个数据库中

2.google查一下

发现不少数同样的问题,但是参考了下,都无法解决,

在Mybatis-spring中由于默认Autowired导致不能配置多个数据源的问题分析及解决

3.开发工具查看Bean

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

它里面有一个选项卡是Spring Explorer

一次Spring多数据源遇到的坑(转载)

通过这个选项卡,我发现datasource只有一个,可是明明写了2个啊 id还不一样

一次Spring多数据源遇到的坑(转载)

所以我尝试修改第二个datasource的class为 org.springframework.jdbc.datasource.DriverManagerDataSource 

项目跑起来,不报错了,所以

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

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

五、后续发现

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

一次Spring多数据源遇到的坑(转载)

发现了 如果alias不存在,才会调用registerPool(),

是否存在调用的是,也就是一个一个map的key是否存在,

一次Spring多数据源遇到的坑(转载)

果断debug查看下 如果不给alias属性时候的情况,是null

一次Spring多数据源遇到的坑(转载)

所以才会出现两个都是ProxoolDataSource的时候,第二个总是使用第一个,

所以还可以通过给两个添加<property name="alias" value="xxxx" />来使用