【问题标题】:Spring Boot JPA Slave CacheSpring Boot JPA 从属缓存
【发布时间】:2017-01-05 12:58:02
【问题描述】:

我们正在将我们的许多应用程序迁移到云端 - 但是有一个应用程序需要留在内部,因为它与一些本地硬件接口。

有问题的应用程序是使用 Spring Boot 编写的,并且在 MYSQL 数据库上执行 90% 的读取操作,只有偶尔写入。我已经设置了一个主从 MYSQL 复制,其中内部服务器充当云数据库服务器的复制从属。

如何将 Spring Boot 配置为使用内部数据库进行所有读取操作,同时将写入操作发送到云数据库服务器?

我知道我可以重新构建整个应用程序以使用两个不同的数据源 - 但这看起来需要做很多工作,而这可能是一个不错的方法......?

【问题讨论】:

  • 您可以使用 MariaDB 的 MaxScale。那是一个数据库代理。但是,如果您向云端发送查询(INSERT/UPDATE)并直接读取从属服务器,则 INSERT 不会被复制。它可以使用一点点。您还可以设置更多规则。还可以路由 SELECT 中的特殊关键字,以便也从 master 读取,例如 SELECT /*MASTER*/ * FROM ....
  • 感谢您推荐 MaxScale。我会仔细看看的。您的意思是发送更新然后立即查询它们是 MaxScale 或主/从复制的问题吗?
  • maxscale 也不是问题。复制从主服务器复制结果到从服务器有点慢。如果您识别出此类查询,您可以标记它并在 maxscale 中创建一个规则,该查询也转到主服务器

标签: mysql spring spring-boot


【解决方案1】:

这首先通过将从属指定为连接字符串的一部分来完成。来自here

Connection conn = driver.connect("jdbc:mysql://master,slave1,slave2,slave3/test",
        props);

然后将连接设置为只读(同源):

conn.setReadOnly(false);
conn.setAutoCommit(false);

虽然示例显示手动执行此操作,但如果 Spring 正在管理您的连接,您可以在创建 DataSource 以进行 Spring 管理时指定从属服务器,然后使用 Spring 的 readOnly 事务配置为您完成此操作(参见 @987654322 @)。

【讨论】:

  • 好点 - 我没有意识到这可能是 MYSQL 驱动程序本身的一个特性。然而,经过一番谷歌搜索后,我偶然发现了 jdbc:mysql:loadbalance://localhost:3306,localhost:3310/sakila 或 jdbc:mysql:replication://master,slave1,slave2,slave3/test 的特殊语法(来源:dev.mysql.com/doc/connector-j/5.1/en/…) 我必须使用这个还是坚持你的例子?
猜你喜欢
  • 2017-02-22
  • 2020-07-25
  • 2017-11-22
  • 2016-02-19
  • 2020-02-03
  • 2021-11-07
  • 2018-11-09
  • 2016-10-13
  • 2018-08-06
相关资源
最近更新 更多