spring 集成mybatis动态设置数据源,实现读写分离
2016-08-26 00:00
701 查看
摘要: spring 集成mybatis动态设置数据源,实现读写分离
由于业务需要,需要用到读写分离,但是现在一些现有的中间件满足不了我们现在复杂的业务逻辑,只有自己在spring里面搞,幸好有官方代码。
通常 spring集成mybatis的集成方式:
第一种是采用MapScannerConfigurer,它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean。这种我用的比较少
第二种 是采用接口org.apache.ibatis.session.SqlSession的实现类org.mybatis.spring.SqlSessionTemplate。在dao层直接注入模板
第三种是采用抽象类org.mybatis.spring.support.SqlSessionDaoSupport提供SqlSession。
关于具体配置就请百度。
下面说的是动态切换数据源,网上说的是两种,
一种是重写SqlSessionTemplate,重写getSqlSessionFactory,getConfiguration和SqlSessionInterceptor方法,
另一种就是重写SqlSessionDaoSupport,重写里面的getSqlSessionFactory方法。第一种我没有试过,不过网上很多,第二种经过实践过了,非话不多说,直接上代码。
首先在你的配置文件里面设置多数据源
以上是mybatis与spring集成的配置文件。到此xml配置完成。
由于需要在程序里面切换数据源,还要考虑到多个线程的请求过来,因为我们需要写一个帮助类,用来帮助我们切换数据源
此处用了threadLocal对象来保存线程的副本,他是一个线程私有的对象。Const是一个常量类,代码如下
其次就核心类DynamicSqwriteSqlSessionlSessionDaoSupport,他集成DaoSupport类重写了getSqlSession()方法,具体代码如下:
此处的readSqlSession,writeSqlSession分别对应配置文件里面的sqlSession,写测试代码
主要是dao层,数据源默认的是写数据源,所以在需要读数据源的时候设置一下,dao层集成你写的动态的
就ok了,亲测,没问题,数据源可以设置多个,
由于业务需要,需要用到读写分离,但是现在一些现有的中间件满足不了我们现在复杂的业务逻辑,只有自己在spring里面搞,幸好有官方代码。
通常 spring集成mybatis的集成方式:
第一种是采用MapScannerConfigurer,它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean。这种我用的比较少
第二种 是采用接口org.apache.ibatis.session.SqlSession的实现类org.mybatis.spring.SqlSessionTemplate。在dao层直接注入模板
第三种是采用抽象类org.mybatis.spring.support.SqlSessionDaoSupport提供SqlSession。
关于具体配置就请百度。
下面说的是动态切换数据源,网上说的是两种,
一种是重写SqlSessionTemplate,重写getSqlSessionFactory,getConfiguration和SqlSessionInterceptor方法,
另一种就是重写SqlSessionDaoSupport,重写里面的getSqlSessionFactory方法。第一种我没有试过,不过网上很多,第二种经过实践过了,非话不多说,直接上代码。
首先在你的配置文件里面设置多数据源
spring-config-datasource-dbcp.xml <bean id="parentDataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="maxActive" value="30" /> <property name="initialSize" value="2" /> <property name="maxWait" value="30000" /> <property name="maxIdle" value="30" /> <property name="minIdle" value="1" /> <property name="testOnBorrow" value="false"></property> <property name="testWhileIdle" value="true"></property> <property name="validationQuery" value="select 1"></property> <property name="timeBetweenEvictionRunsMillis"> <value>30000</value> </property> <property name="numTestsPerEvictionRun"> <value>10</value> </property> <property name="minEvictableIdleTimeMillis" value="30000"></property> </bean>这里输入代码 <bean id="writeDataSource" parent="parentDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="xxxxxxx" /> <property name="username" value="xxx" /> <property name="password" value="xxx" /> </bean> <bean id="readDataSource" parent="parentDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="xxxx" /> <property name="username" value="xxx" /> <property name="password" value="xxxx" /> </bean> <!--mybatis与Spring整合 开始 --> <bean id="readSqlSessionFactory" name="readSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis_configuration.xml" /> <property name="dataSource" ref="readDataSource" /> </bean> <bean id="writeSqlSessionFactory" name="writeSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis_configuration.xml" /> <property name="dataSource" ref="writeDataSource" /> </bean>
以上是mybatis与spring集成的配置文件。到此xml配置完成。
由于需要在程序里面切换数据源,还要考虑到多个线程的请求过来,因为我们需要写一个帮助类,用来帮助我们切换数据源
public class DBConvertHelper { private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static String getDbType() { String db = contextHolder.get(); if (db == null) { db = Const.DB_TYPE_RW;// 默认是读写库 } return db; } public static void setDbType(String str) { contextHolder.set(str); } public static void clearDBType() { contextHolder.remove(); } }
此处用了threadLocal对象来保存线程的副本,他是一个线程私有的对象。Const是一个常量类,代码如下
public interface Const { public static final String DB_TYPE_RW = "write"; public static final String DB_TYPE_R = "read"; }
其次就核心类DynamicSqwriteSqlSessionlSessionDaoSupport,他集成DaoSupport类重写了getSqlSession()方法,具体代码如下:
public class DynamicSqlSessionDaoSupport extends DaoSupport{ private SqlSession readSqlSession; private SqlSession writeSqlSession; public void setReadSqlSessionFactory(SqlSessionFactory readSqlSessionFactory) { this.readSqlSession = new SqlSessionTemplate(readSqlSessionFactory); } public void setWriteSqlSessionFactory(SqlSessionFactory writeSqlSessionFactory) { this.writeSqlSession = new SqlSessionTemplate(writeSqlSessionFactory); } public SqlSession getSqlSession() { if(Const.DB_TYPE_RW.equals(DBContextHolder.getDbType())){ return writeSqlSession; } else { return readSqlSession; } } @Override protected void checkDaoConfig() throws IllegalArgumentException { notNull(this.readSqlSession, "Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required"); notNull(this.writeSqlSession, "Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required"); } }
此处的readSqlSession,writeSqlSession分别对应配置文件里面的sqlSession,写测试代码
主要是dao层,数据源默认的是写数据源,所以在需要读数据源的时候设置一下,dao层集成你写的动态的
public class MyMessageDaoImpl extends DynamicSqlSessionDaoSupport implements MyMessageDao{ @Override public List<MyMessage> getByPage(CommonReq commonReq) { // DBContextHolder.setDbType(Const.DB_TYPE_RW); return getSqlSession().selectList("MyMessage.selectByPage", commonReq); } @Override public void addFeedBack(FeedBack feedBack) { DBContextHolder.setDbType(Const.DB_TYPE_R); getSqlSession().insert("MyMessage.addFeedBack", feedBack); } }
就ok了,亲测,没问题,数据源可以设置多个,
相关文章推荐
- Spring Boot 集成Mybatis实现主从(多数据源)分离方案
- Spring Boot 集成Mybatis实现主从(多数据源)分离方案示例
- Spring+MyBatis实现数据库读写分离方案
- Spring实现动态数据源,支持动态添加、删除和设置权重及读写分离
- mybatis用spring的动态数据源实现读写分离
- spring+myBatisi实现多数据源动态切换
- SpringBoot入门-21(springboot集成mybatis注解形式增删查改properties配置,利用@Provider实现动态SQL)
- SpringBoot入门-20(springboot集成mybatis注解形式properties配置,利用@Provider实现动态SQL)
- Spring+MyBatis实现数据库读写分离方案
- Spring实现动态数据源,支持动态加入、删除和设置权重及读写分离
- SpringBoot入门-19(springboot集成mybatis注解形式增删查改properties配置,利用《script》实现动态SQL)
- spring和mybatis集成(二) 设置spring的动态数据源
- Spring整合Mybatis实现动态数据源切换教程配置
- spring mybatis 用注解方式实现动态切切换数据源
- Spring整合Mybatis实现动态数据源切换教程配置
- Spring+MyBatis实现数据库读写分离方案
- Spring+MyBatis实现数据库读写分离方案
- Spring+MyBatis实现数据库读写分离方案
- 使用mybatis +spring 插件实现读写分离
- Spring+MyBatis实现数据库读写分离方案