op 最近优化一个老项目,项目之前是单数据库( MySQL5.7 )。因为数据量太大了读写也很频繁,数据库顶不住,领导让我优化,其中一点提到将其改成读写分离的形式,第一次接触没有相关经验。想请教一下大伙,Java 里面读写分离的模式用多数据源还中间件合适?最好对代码的改动最小。如果用中间件的话有什么比较推荐的中间件吗?
1 mark2025 2024-05-29 15:39:11 +08:00 搞个主从? |
![]() | 2 LongMaoz 2024-05-29 15:40:36 +08:00 先搞个最简单的 主从 mysql 是支持主从库的 增删改走主表 查从表 |
![]() | 3 seedhk 2024-05-29 15:41:11 +08:00 多数据源吧,有现成的(mybatis-plus 有一款多数据源的插件)可以直接用 |
4 THESDZ 2024-05-29 15:42:33 +08:00 1.应用程序+主从数据库 2.应用程序+Mycat 中间件+主从数据库 |
![]() | 5 goodryb 2024-05-29 15:56:42 +08:00 既然你提到代码改动最小,那当然是用中间件了 |
6 333v22 2024-05-29 16:13:32 +08:00 |
7 cryboy007 2024-05-29 16:29:09 +08:00 直接换用 TIDB |
8 linxb 2024-05-29 16:38:39 +08:00 mysql 简单的主从配置下,改动的代码也就几行吧 |
![]() | 9 xiwolaisi 2024-05-29 16:58:49 +08:00 Proxysql https://proxysql.com/ |
10 dode 2024-05-29 23:42:56 +08:00 via Android 换固态 |
![]() | 11 Aresxue 2024-05-30 10:52:22 +08:00 多数据源简单一点,目前来看 https://github.com/baomidou/dynamic-datasource 这个写的还不错的,不建议 ShardingSphere-JDBC 它目前的实现入侵性太强,需要比较重的分库分表的场景才更合适。 |
12 kim01 2024-05-30 13:31:13 +08:00 直接套路云 MySQL 集群高级版自带读写分离。。。 |
![]() | 13 JackCh3ng 2024-05-30 14:52:30 +08:00 |
14 paranoiagu 2024-05-30 17:01:13 +08:00 mariadb 的 Maxscale 试试看。 |
15 sampeng 2024-05-30 19:19:55 +08:00 如果是云。改机器配置。99%的项目,直接升级配置的成本远低于人的成本。。。 |
![]() | 16 Aresxue 2024-05-31 14:06:50 +08:00 ![]() @JackCh3ng ShardingSphere-JDBC 不兼容原有的配置格式,而且会把整个 Datasource 和 Connection 都换成自己,不需要分表的 sql 也会走它的拦截分析,很多语法都不支持,同时还需要手动指定不需要走分表的单表有哪些,动态数据源那里不用它的 starter 而是复用它的 DynamicDatasource ,自己写个配置解析 sql 然后做路由不需要业务代码变更一行而且没有任何 sql 兼容性问题 |
![]() | 17 Dongxiaohao OP @Aresxue #16 昨天换成了这个,挺方便,很好使。就是不知道使用是否合规,我吧大部分的 DAO 层的 select 全部加了 DS 注解让他查询从库 |
![]() | 18 JackCh3ng 2024-05-31 16:22:31 +08:00 @Aresxue op 只是要读写分离,你说的分库分表 sql 语法不支持又是另外一个东西了。如果从灵活性上来说肯定动态数据源更灵活,对实际业务的干扰更可控。但 op 只是想要简单,改动代码最小,ShardingSphere-JDBC 不需要动 Java 代码,无脑把路由交给它,你什么都不用做,只要做一下配置就行了,如果不合适,配置还原,一切照旧。 |
![]() | 19 Aresxue 2024-06-02 15:12:47 +08:00 @Dongxiaohao 代码不多的话加个注解也是个蛮简单的方式,要是想作为一个可以面向几十个应用的功能就可以像我说的做个二方包在里面写一些路由逻辑,这个东西的好处就是对 sql 语法没有任何要求,需要注意的是潜在的事务问题(跨数据源),你使用时注意点。 |