MyBatis多数据源配置(读写分离)mysql
首先说明,本文的配置使用的最直接的方式,实际用起来可能会很麻烦。spring
实际应用中可能存在多种结合的状况,你能够理解本文的含义,不要死板的使用。sql
一般是MySql一主多从的状况,本文的例子就是主从的状况,可是只有两个数据源,因此采用直接配置不会太麻烦,可是不利于后续扩展,主要是做为一个例子来讲明,实际操做请慎重考虑。数据库
针对这种状况,一个更好的解决方法能够参考(本人没有实际尝试过):express
http://blog.csdn.net/lixiucheng005/article/details/17391857api
还有一个经过SpringAbstractRoutingDataSource
路由接口的方式:微信
当业务独立性强,数据量大的时候的,为了提升并发,可能会对表进行分库,分库后,每个数据库都须要配置一个数据源。并发
这种状况能够参考本文,可是须要注意每个数据库对应的Mapper要在不一样的包下方便区分和配置。app
另外分库的状况下也会存在主从的状况,若是你的数据库从库过多,就参考上面提供的方法,或者寻找其余方式解决。
分库的状况下,不一样的数据库的Mapper必定放在不一样的包下。
主从的状况下,同一个Mapper会同时存在读写的状况,建立两个并不合适,使用同一个便可。可是这种状况下须要注意,Spring对Mapper自动生成的名字是相同的,并且类型也相同,这是就不能直接注入Mapper
接口。须要经过SqlSession
来解决。
applicationContext.xml
这个文件,主要是引入了spring-datasource-master.xml
和spring-datasource-slave.xml
。
spring-datasource-master.xml
spring-datasource-slave.xml
和master
区别不大,主要是id
名字和数据源配置有区别。
这里须要注意<tx:method name="*" read-only="true"/>
是只读的。若是不是从库,能够按主库进行配置。
在下面代码中:
必须经过sqlSessionFactoryBeanName
来指定不一样的sqlSessionFactory
。
config.properties
这里是针对主从的状况进行设置的,两个配置扫描的Mapper
是同样的,因此无法直接注入,须要经过下面的麻烦方式注入。
由于sqlSession
能经过name
区分开,因此这里从sqlSession
获取Mapper
。
另外若是须要考虑在同一个事务中写读的时候,须要使用相同的writeMapper
,这样在读的时候,才能获取事务中的最新数据。
以上是主从的状况。
在分库的状况时,因为不一样Mapper在不一样的包下,因此能够直接使用@Resource
或者@Autowired
注入Mapper
,不须要经过sqlSession
获取。
本篇文章,只是一个多数据源的参考,实际应用时,请根据本身的状况进行考虑。
后续,我会利用业余时间,在本文和上面两个相关连接的基础上,针对MySql多数据源,尝试开发能够自动切换数据源的插件,由于我对这方面的实际应用不是很熟,因此欢迎你们留言分享本身的解决方案,对这些了解的越多,就越有可能开发出通用的数据源切换插件。