chenlei2 / spring-boot-mybatis-rw Goto Github PK
View Code? Open in Web Editor NEW基于mybatis,springboot开箱即用的读写分离插件
License: Apache License 2.0
基于mybatis,springboot开箱即用的读写分离插件
License: Apache License 2.0
很好的插件,准备用到项目中,请问如果我要强制走主库,怎么操作?谢谢
DataSourceProxy类中,
method.invoke(((Map)ConnectionHold.CONNECTION_CONTEXT.get()).get(ConnectionHold.CURRENT_CONNECTION.get()), args);
这里抛错。
at com.github.pagehelper.PageHelper.getUrl(PageHelper.java:282) ~[pagehelper-4.1.1.jar:na]
at com.github.pagehelper.PageHelper.getSqlUtil(PageHelper.java:305) ~[pagehelper-4.1.1.jar:na]
at com.github.pagehelper.PageHelper.initSqlUtil(PageHelper.java:263) ~[pagehelper-4.1.1.jar:na]
at com.github.pagehelper.PageHelper.intercept(PageHelper.java:250) ~[pagehelper-4.1.1.jar:na]
原因是:pageHelper 要依赖connection的DatabaseMetaData。 conn.getMetaData().getURL();
你后续会修复吗?
如果是事务,那么会希望也是从主库读取数据,
能强制一个事务(一个service方法)全都走主库吗?
这个启动起来,访问的时候就找不到mapper
1、测试发现,DataSourceProxy.java 中调用链如下:
-- method: getAutoCommit
-- method: getTargetConnection
----getTargetConnection---true | 4
-- method: prepareStatement
getAutoCommit 和 getTransactionIsolation 方法,因为没有默认值(没注入)
均会调用下面的getTargetConnection 方法,来先占用一个write(默认,还没到mapper拦截器)的connection
导致写库连接不能被回收。
2、RWManagedTransaction 中的commit,直接对writeCon和readCon 执行commit方法,当方法不配置事务时,connection是autoCommit的,执行会报异常,但是被catch住了。
3、insert.selectKey会被路由到从库 (select类型)
RWPlugin.java
if (mappedStatement.getSqlCommandType() == SqlCommandType.SELECT
&& !mappedStatement.getId().endsWith("!selectKey")) {
key = ConnectionHold.READ;
}
4、建议:
是否考虑抽取一个数据源(目前是用的tomcat jdbc), spring-boot的默认配置,支持type来制定数据源
1.首先我是在你给的例子上面做的测试
@Bean(name="dataSourceProxy") //@ConditionalOnMissingBean @ConditionalOnBean(name = { "writeDataSource", "readDataSources" }) public DataSource dataSource( @Qualifier("readDataSources") Object readDataSoures, @Qualifier("writeDataSource") Object writeDataSource) { }
DataSource这里如果不把@ConditionalOnMissingBean注解去掉,它就不会实例化。然后,我把它命名为dataSourceProxy,SqlSessionFactory的参数上面加@qualifier("dataSourceProxy")之后才可以正常初始化SqlSessionFactory。
@Bean public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSourceProxy")DataSource dataSource) throws Exception {}
2.还有个比较难办的问题是,假如我同一个方法中既有查询又有更新,并且我在方法上面加了@transactional事务注解,那么,数据源就无法切换。比如我先查询,更新的时候也是走的读库,如果我先更新,那么查询的时候就走写库,主要问题是因为如果开了事务的话,第二次SqlSession开启链接的时候没有再次调用dataSourceProxy.getConnection方法,所以也就没有切换数据源
请问需要什么版本的eclipse?
按说不应该是先调用RWPlugin,设置是使用哪种类型的数据源,然后获取数据源,调用吗??是不是顺序反了?
你好,大概看了下,想问下和spring AbstractRoutingDataSource这个有什么异同嘛?能简单说下吗?谢谢!
在作者插件基础上,想融入连接池druid,请问作者有好的建议吗
建议发布到maven仓库,方便使用,谢谢
springboot都没有配置文件了 你这个怎么用呢
你们 想问一下 集成这个插件 在执行数据库操作的时候 怎么通过日志输出来获取数据源 是执行的read 还是 write 库的呢,希望通过日志输出来获取到 本次操作的数据库连接地址来确认本次datasource 是正确的额
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.