两台服务器之间共享数据库

时间:2009-12-08 07:24:16

标签: java mysql database apache hibernate

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

我需要第二台服务器来共享负载,但是使用第一台服务器上的相同数据库。

后端处理(不包括db事务)非常耗时,因此第二个服务器用于后端处理)。

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

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

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

2 个答案:

答案 0 :(得分:2)

只要其中一个应用程序在共享表上进行数据库更新,您就可以了。你绝对不希望发生的是:

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

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

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

编辑1:回答评论

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

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

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

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

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

我如何解决类似问题的例子:

  • app 1接收数据,并将其写入table1
  • app 2读取table1,处理它,并写入/更新table2
  • app 2删除table1中已处理的记录

请注意,app 1仅写入共享表。它还可以从其他表中读取,写入和更新,但app 2不会访问这些表,因此没有问题。

答案 1 :(得分:0)

这是一种相当常见的方法,用于故障转移和负载平衡。

这是一篇描述设置的简短文章: http://raibledesigns.com/tomcat/

请注意此设置中的单身人士。