Mybatis拦截器实现读写分离的思路和实践
写点笔记
共 5940字,需浏览 12分钟
· 2021-08-19
说到这里,我们可以再思考一个问题,一般数据库都是主从,也就是很多都是一主多从,对应的就是一写多读,意思是写的时候写到主库,读的时候可以从从库的任意中读取。因此我们的插件要有写库的数据源已经多个读库的数据源。
上边说了那么多,如果没有读写识别的信号,那说的再多也没有价值。这块我们就需要解析SQL或者解析方法上边的特定注解了。前者为一般模式,后者是灵活配置。当然这块要注意的就是事务了,事务肯定要操作单库,也必然是主库,道理说了挺多哈。我们试着研究一下怎么做吧。
1.首先就是Mybatis插件了,记得之前我们说mybatis有4个阶段(Executor、ParameterHandler、ResultSetHandler 以及 StatementHandler),每个阶段的各个方法都可以被拦截,当然这块拦截器的拦截原理责任链模式,过程还是比较难的。然后通过jdk代理的方式植入到mybatis执行过程中。这块的笔记已经忘的差不多了。再此贴个笔记。
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class,Integer.class})})
public class MybatisLanjieqi implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
System.out.println(statementHandler.toString());
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
System.out.println("enter the plugin");
if (target instanceof StatementHandler) {
return Plugin.wrap(target, this);
} else {
return target;
}
}
}
考虑到我们要在代码中灵活决定采用那种类型的数据源,因此我们需要需要将现场的一些东西传过来,比如调用类的信息。当然还有sql的类型什么的。这块我们debug一下。看看我们的StatementHandler中有什么值。
public class MyDataSource extends DruidDataSource {
private static DruidDataSource write;
private static Listreader;
//模拟多库初始化....
public static DruidDataSource getDruidDataSource(String url,String userName,String password) throws SQLException {
DruidDataSource ds = new DruidDataSource();
ds.setUrl(url);
ds.setUsername(userName);
ds.setPassword(password);
try {
ds.setFilters("stat,mergeStat,slf4j");
} catch (Exception var18) {
}
ds.setMaxActive(50);
ds.setInitialSize(1);
ds.setMinIdle(1);
ds.setMaxWait(60000);
ds.setTimeBetweenEvictionRunsMillis(120000);
ds.setMinEvictableIdleTimeMillis(300000);
ds.setValidationQuery("SELECT 'x'");
ds.setPoolPreparedStatements(true);
ds.setMaxPoolPreparedStatementPerConnectionSize(30);
ds.setTestWhileIdle(true);
ds.setTestOnReturn(false);
ds.setTestOnBorrow(false);
ds.init();
return ds;
}
static {
//初始化write...
try {
write=getDruidDataSource("jdbc:mysql://127.0.0.1:3306/tianjl?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true","root","tianjingle");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
//初始化读库
// reader.add(write);
// reader.add(write);
// reader.add(write);
}
public DruidPooledConnection getConnection() throws SQLException {
//这块可以写具体得库选择逻辑,读库随机可以从用random方法。
return write.getConnection();
}
}
"dataO") (name =
public SqlSessionFactoryBean getSqlSessionFactoryOne1() throws Exception {
//xml和实体的映射
SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(new MyDataSource());
sqlSessionFactoryBean.setTypeAliasesPackage("com.example.demo.one");
Resource[] resources = new Resource[]{new ClassPathResource("tian/one/OneMapper.xml")};
sqlSessionFactoryBean.setMapperLocations(resources);
sqlSessionFactoryBean.setPlugins(new MybatisLanjieqi());
return sqlSessionFactoryBean;
}
"dataTwo") (name =
public MapperFactoryBean getSqlSessionFactoryTwo() throws Exception {
//xml和实体的映射
SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(new MyDataSource());
sqlSessionFactoryBean.setTypeAliasesPackage("com.example.demo.two");
sqlSessionFactoryBean.setMapperLocations(new ClassPathResource("tian/two/TwoMapper.xml"));
//单个数据源所有的数据库映射
MapperFactoryBean mapperFactoryBean=new MapperFactoryBean();
//设置sqlSessionTemplate,zhuru yong de
mapperFactoryBean.setMapperInterface(TwoMapper.class);
mapperFactoryBean.setSqlSessionFactory(sqlSessionFactoryBean.getObject());
return mapperFactoryBean;
}
晚安~
评论
金融研究 | 使用Python测量关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
我看阿里的年终奖总算发了!
到4月底了,这两天看朋友圈,发现阿里的年终奖终于发了,问了问老同学,也从网上检索了不少信息,基本搞清楚了阿里今年的年终奖情况。近来来阿里一些集团对绩效等级做了较大的调整,以前的旧绩效系统中,绩效分为3.25、3.5、3.75、4和5五个等级,其中4和5是较高绩效等级,较少见。而且之前3.5绩效内部划
公子龙
0
CVPR 2024|大视觉模型的开山之作!无需任何语言数据即可打造大视觉模型
↑ 点击蓝字 关注极市平台作者丨科技猛兽编辑丨极市平台极市导读 本文提出一种序列建模 (sequential modeling) 的方法,不使用任何语言数据,训练大视觉模型。>>加入极市CV技术交流群,走在计算机视觉的最前沿本文目录1 序列建模打造大视觉模型(来自 U
极市平台
1
金融研究(更新) | 使用Python构建关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
盘点Lombok的几个骚操作,你绝对没用过!
👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新项目正在酝酿中
小哈学Java
0
堪称最优秀的Docker可视化管理工具——Portainer你真的会用吗?
来源:blog.csdn.net/shark_chili3007/article/details/123366179👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目
小哈学Java
0
Apache Paimon毕业,湖仓架构的未来发展趋势!
北京时间 2024 年 4 月 16日,开源软件基金会 Apache Software Foundation(以下简称 ASF)正式宣布 Apache Paimon 毕业成为 Apache 顶级项目(TLP, Top Level Project)。经过社区的共同努力和持续创新,Apache Paim
程序源代码
0
JS的这些新特性,你都用过么?
大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群作为一门不断演进的语言,JavaScript每年都会引入新特性。这些特性的加入,能够帮助我们编写更加简洁、高效、易于维护的代码。然而,并非所有新特性
程序员成长指北
1