
spring-data-jpa,如何实现多数据源动态切换实现读写分离,网上的教程都看遍了,都不行,debug 跟踪了三天都没找到在哪里切换数据源。
有没有大牛可以分享下实现代码?
感激涕零...
1 tonyli 2018 年 3 月 1 日 小弟,不才之前,也被困惑许久,我自己有总结出一个可行方式。 https://github.com/Linda-Tan/spring-boot/blob/master/src/main/java/com/junliang/spring/config/JpaConfig.java |
2 beginor 2018 年 3 月 1 日 via Android 读写分离难道不应该在数据库层面做么? |
3 CoderGeek 2018 年 3 月 1 日 首先读写分离最好用数据层面 可以看看 三方一类提供的 读写分离 mysql 介绍 还有如果是单纯的切换数据源 用 springboot 尝试过 网上有很多例子 |
4 CoderGeek 2018 年 3 月 1 日 数据库层面 |
5 wmhack 2018 年 3 月 1 日 via iPhone jpa,后期维护,你会想哭 |
8 tonyli 2018 年 3 月 1 日 有人知道怎么删除评论吗 |
11 unlimitedsola 2018 年 3 月 1 日 @reid2017 数据库也是用代码实现的,不如你尝试自己用代码实现一个吧 |
12 reid2017 OP @tonyli 看了你的代码,有点茅塞顿开的感觉,你的 JpaConfig 里注入了 routingDataSource,我是对应两个 dataSource ( write / read ) 分别写了两个 JpaConfig,分别注入两个 dataSource,明天试下你的方式看下行不行。 |
13 letitbesqzr 2018 年 3 月 1 日 @wmhack #5 面对企业级应用动则上千张表,不用 jpa 你会想哭。 |
14 wojfsdj 2018 年 3 月 1 日 @letitbesqzr 请教一下,用 spring data jpa 复杂的关联关系查找你们是用什么方式做的呢? 写 HQL 还是用 Criterion 之类呢? |
15 letitbesqzr 2018 年 3 月 1 日 @wojfsdj #14 很少去写 hql,Criteria 用的比较多,然后就是 querydsl 了,报表之类的几乎都是 querydsl 来做,很少遇见写不出来的函数。调点数据库的聚合函数也轻轻松松。 |
16 wojfsdj 2018 年 3 月 1 日 @letitbesqzr 非常感谢,querydsl 了解得比较少。最近做报表之类的,每个查询都要关联几个表,过滤条件也不少,让人比较头疼。 而且查询出来的数据字段又不同,不同的表不同的字段,也不知道是封装成对象好还是自己用 Map 组装再给前端比较好 |
18 wmhack 2018 年 3 月 2 日 via iPhone @letitbesqzr jpa 代码侵入了,没有 mybatis 直接写 sql 看着直观,jpa 调试时,日志打印也看不到执行的 sql 语句 |
19 ghos 2018 年 3 月 2 日 via Android 每次看到 jpa 的帖子 总是有人说好有人说不好 争了几年也没有争出所以然来。。。。 |
20 letitbesqzr 2018 年 3 月 2 日 @wmhack 只能说你不会用,看不到 sql 执行, 你当大家都是傻的? 让连接池输出执行的 sql 和参数不行? |
22 zhouyou457 2018 年 3 月 2 日 jpa 和 mybatis 的问题业界都吵了多久了....哪个用着顺手就行了嘛.. 另外,AbstractRoutingDataSource 了解一下 |
23 reid2017 OP @zhouyou457 用的就是 AbstractRoutingDataSource,不知道是否用得不对 |
24 wmhack 2018 年 3 月 2 日 via iPhone @letitbesqzr 好吧,我只是说说自己的观点。 |
25 reid2017 OP @tonyli 还是不行,你的使用了 MyBatis,把 routingDataSource 注入到 SqlSessionFactory,我没有使用 MyBatis,只用 sping-data-jpa |
26 zhouyou457 2018 年 3 月 2 日 try { String datasourceName = getAnnotationDatasource(proceedingJoinPoint); if (datasourceName != null) { DataSourceContextHolder.setDataSourceType(datasourceName); } return proceedingJoinPoint.proceed(); } finally { DataSourceContextHolder.clearDataSourceType(); } 大致就是这样... getAnnotationDatasource 是用切片配合注解获取需要切换到的数据源 |
27 reid2017 OP @zhouyou457 大致是这样写的,都不行。每次都路由到我配置的 slave 数据源,而不是 master 数据源 |
30 ourslay 2018 年 3 月 3 日 |
31 chinadeng 2018 年 3 月 4 日 @letitbesqzr 用 querydsl,你们大概多少张表关联查询? |