我目前的设置是一个带有Java的专用服务器,运行在tomcat上的hibernate应用程序,apache http服务器,MYSQL。
我需要第二台服务器来共享负载,但是使用第一台服务器上的相同数据库。
后端处理(不包括db事务)非常耗时,因此第二个服务器用于后端处理)。
此设置会不会产生任何不良后果?这是最佳设置吗?
我的应用程序会更新/删除并具有以下事务控制:
beginTransaction(); getSession().save(obj); //sessionFactory.openSession().save(obj); commitTransaction()
答案 0 :(得分:2)
只要其中一个应用程序在共享表上进行数据库更新,您就可以了。你绝对不希望发生的是:
app1: delete/update table1.record24
app2: delete/update table1.record24
因为当Hibernate写入记录时,其中一个进程会注意到数据已更改并抛出错误。而作为经典的海森堡,它很难再现。
另一方面,当责任明确分开时(应用程序共享数据以供阅读,但不删除/更新相同的表),它应该没问题。记录该行为虽然作为未来的升级可能不会考虑到这一点。
编辑1:回答评论
您通过设计克服了并发问题。对于任何给定的表格:
您的前端可能会插入表中,后端可以读取这些表, 必要时更新行,创建新的结果行,并删除行作为清理。
或者,当应用程序进行通信时,前端可以将给定任务的记录的所有权转移到业务后端,从而在完成时将所有权返回。确保在传输所有权之前刷新了hibernate缓存(执行事务)并且没有使用该任务的hibernate对象。
游戏的诀窍是确保Hibernate不会尝试写入由其他应用程序更改的记录,因为这会导致StaleStateException。
我如何解决类似问题的例子:
请注意,app 1仅写入共享表。它还可以从其他表中读取,写入和更新,但app 2不会访问这些表,因此没有问题。
答案 1 :(得分:0)