基于mybatis+spring的读写分离
来源:互联网 发布:淘宝锚点定位跳转 编辑:程序博客网 时间:2024/04/29 04:08
在SqlSessionTemplate上层进行了封装,根据调用的方法,切换master/slave,但是无法支持事务
package com.xjy.study.spring.mybatis;import java.util.List;import java.util.concurrent.ThreadLocalRandom;import javax.sql.DataSource;import org.apache.ibatis.mapping.Environment;import org.apache.ibatis.session.Configuration;import org.mybatis.spring.SqlSessionTemplate;// 不支持事务public class RWSqlSessionTemplate { private SqlSessionTemplate sqlSessionTemplate; private DataSource masterDataSource; private List<DataSource> slaveDataSources; private volatile boolean isMaster = true; public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { this.sqlSessionTemplate = sqlSessionTemplate; } public void setMasterDataSource(DataSource masterDataSource) { this.masterDataSource = masterDataSource; } public void setSlaveDataSources(List<DataSource> slaveDataSources) { this.slaveDataSources = slaveDataSources; } public <T> T selectOne(String statement, Object parameter) { switchToSlave(); return sqlSessionTemplate.selectOne(statement, parameter); } public int update(String statement, Object parameter) { switchToMaster(); return this.sqlSessionTemplate.update(statement, parameter); } private void switchToSlave() { if(isMaster) { switchToSlaveDataSource(); isMaster = false; } } private void switchToMaster() { if(!isMaster) { switchToMasterDataSource(); isMaster = true; } } private void switchToSlaveDataSource() { Configuration configuration = this.sqlSessionTemplate.getSqlSessionFactory().getConfiguration(); Environment oldEnvironment = this.sqlSessionTemplate.getSqlSessionFactory().getConfiguration().getEnvironment(); int index = ThreadLocalRandom.current().nextInt(slaveDataSources.size()); Environment newEnvironment = new Environment(oldEnvironment.getId(), oldEnvironment.getTransactionFactory(), slaveDataSources.get(index)); configuration.setEnvironment(newEnvironment); } private void switchToMasterDataSource() { Configuration configuration = this.sqlSessionTemplate.getSqlSessionFactory().getConfiguration(); Environment oldEnvironment = this.sqlSessionTemplate.getSqlSessionFactory().getConfiguration().getEnvironment(); Environment newEnvironment = new Environment(oldEnvironment.getId(), oldEnvironment.getTransactionFactory(), this.masterDataSource); configuration.setEnvironment(newEnvironment); }}
0 0
- 基于mybatis+spring的读写分离
- 基于Spring的实现数据库读写分离
- 基于Spring AOP方式的读写分离
- java-durid、mybatis、spring 整合基于 AbstractRoutingDataSource 的多数据源读写分离配置
- 基于mybatis读写分离插件
- spring + mybatis实现读写分离
- 基于mybatis的shard方案(分表分库、读写分离)
- 基于mybatis的shard方案(分表分库、读写分离)
- Spring和MyBatis实现数据的读写分离
- Spring和MyBatis实现数据的读写分离
- 基于spring的方式进行读写分离思考
- MySQL 主从配置和基于Spring 的读写分离
- 基于druid和spring的动态数据库以及读写分离
- spring MVC、mybatis配置读写分离
- 使用mybatis +spring 插件实现读写分离
- mysql+spring+mybatis实现数据库读写分离
- Spring+Mybatis透明实现读写分离
- spring+mybatis实现数据库读写分离
- MP4V2
- cf#94-div1-A. Statues
- 基于spring+redis读写分离实践
- [CodeForces 607A]Chain Reaction[DP]
- 【网络基本功系列五】细说路由下
- 基于mybatis+spring的读写分离
- [2041]: 超级楼梯(递归)
- 1376 最长递增子序列的数量(dp+线段树优化)
- cf#211-D. Renting Bikes-二分
- android listview 异步加载图片并防止错位
- ns-3快速上手-开发环境搭建篇(译)
- Java基础(一)
- Logistic Regression的一些认识
- School Regional Team Contest, Saratov, 2011-F. Spiders-求树直径