gpt4 book ai didi

java - 两台服务器共享数据库

转载 作者:搜寻专家 更新时间:2023-10-30 23:24:19 26 4
gpt4 key购买 nike

我目前的设置是一个单独的专用服务器,带有 Java、在 tomcat 上运行的 hibernate 应用程序、apache http 服务器、MYSQL。

我需要获得第二台服务器来分担负载,但使用与第一台服务器相同的数据库。

后端处理(不包括数据库事务)很耗时,因此后端处理的第二台服务器)。

此设置会产生任何不良后果吗?这是最佳设置吗?

我的应用程序确实更新/删除并具有如下事务控制:

beginTransaction();            getSession().save(obj);            //sessionFactory.openSession().save(obj);            commitTransaction()

最佳答案

只要其中一个应用程序在共享表上进行数据库更新,您应该没问题。您绝对不希望发生的是:

app1: delete/update table1.record24
app2: delete/update table1.record24

因为当 Hibernate 写入记录时,其中一个进程会注意到数据已更改并抛出错误。而且作为经典的 Heisenbug,它真的很难重现。

另一方面,当职责明确分开时(应用程序共享读取数据,但不删除/更新相同的表)应该没问题。记录该行为虽然作为 future 的升级可能不会考虑到这一点。

编辑 1:回答评论

您通过设计克服了并发问题。对于任何给定的表:

  • 两个应用程序都可以插入
  • 两个应用都可以选择
  • 其中一个应用程序也可以更新/删除该表

你的前端可能会插入到表中,后端可以读取这些表,在必要时更新行,创建新的结果行,并删除行作为清理。

或者,当应用程序通信时,前端可以将给定任务的记录所有权转移到业务后端,业务后端在完成后归还所有权。确保刷新 hibernate 缓存(执行事务)并且在转移所有权之前没有使用该任务的 hibernate 对象。

游戏的诀窍是确保 Hibernate 不会尝试写入被其他应用更改的记录,因为这会导致 StaleStateException。

以及我如何解决类似问题的示例:

  • app 1接收数据,写入table1
  • app 2 读取 table1,处理它,然后写入/更新 table2
  • app 2删除table1中处理过的记录

请注意,应用程序 1 仅写入共享表。它还从其他表读取、写入和更新,但应用 2 不访问这些表,所以这没问题。

关于java - 两台服务器共享数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1865218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com