一次Spring多数据源遇到的坑(转载)
来源:互联网 发布:kmp算法next数组程序 编辑:程序博客网 时间:2024/06/13 22:02
转自 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.配置文件
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>
四、问题解决过程
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" />来使用
- 一次Spring多数据源遇到的坑(转载)
- (转载)spring多数据源配置
- 配置多数据源(oracle)遇到的一些问题
- 如何在spring框架中解决多数据源的问题【转载】
- spring多数据源
- spring 多数据源
- spring 多数据源
- spring多数据源
- spring中解决多数据源的问题(二)
- spring多数据源的配置(分布式事务管理)
- 记录学习的点滴(Spring多数据源配置)
- spring hibernate 多数据源的配置
- Spring多数据源的配置(荐)
- Spring多数据源的配置
- spring+hibernate多数据源的应用
- Spring多数据源的动态切换
- Spring多数据源的配置
- Spring多数据源的动态切换
- 欢迎使用CSDN-markdown编辑器
- C++ STL中Map的按Key排序和按Value排序
- Train Problem I
- iOS
- Java Arrays.sort源代码解析
- 一次Spring多数据源遇到的坑(转载)
- 知乎牛人--移动设备的WiFi定位原理
- Linux网络属性配置命令和管理详解
- Thymeleaf 模板的使用
- OpenStack一个开源的云计算管理平台项目
- 20170828_输入输出缓冲区的清除
- RxJava+Retrofit+MVVM的封装
- 类锁和对象锁的区别
- c++术语辨析——顶层const和底层const