2012-03-31 76 views
0

我有一个使用hibernate的web应用程序,它应该在多个tomcat实例上运行以实现负载平衡。每个请求都有自己的hibernate会话和事务。事务在请求开始时开始,并在最后被提交或回滚(取决于抛出或不抛出的异常)。在多台服务器上使用Hibernate和Tomcat并行访问

在一点上(也许更多的将来),我必须检查一个记录是否已经存在(取决于不是主字段的字段),只有在没有的时候才会插入(我不想使用数据库约束是独立于数据库的)。为了解决这个问题,我做了一个选择,如果它没有结果插入。为了处理并发请求我使用了一个同步块。这不起作用,因为每个请求都在自己的事务中运行,无法“看到”并发请求所做的更改。为了摆脱这个问题,我手动提交并在synchronized块中启动一个新的事务来获取当前的数据库状态。

只要应用程序只在一台服务器上运行,这就行得通了(尽管我认为这是不好的练习代码)。只要它在多个实例上运行,它就不再工作了,因为我无法在多个实例之间同步代码。

这个问题(或至少是多实例问题)是如何通过良好的练习代码解决的?

非常感谢!

回答

0

这个问题没有很好的答案。一般来说这是不可能的 - 或者不应该这样做。 BLe ble ble .....

如果数据库只有一个您的同步点,则尝试使用插入的业务键检查SQL插入。

它看起来像: INSERT成MYTABLE(COL1,COL2)SELECT MYVAL1,MYVAL2 FROM(DUAL或其他SYSTABLE),其中

在此礁适当的数据库事务隔离级别必须设置。

+0

感谢您的回答。我对我的问题做了一些进一步的研究,并考虑将整个表锁定为一个请求(事务),以便每个其他请求都必须等待此请求完成(对于应用程序来说,这可以)。我尝试过Session.lock,Session.buildLockRequest和Criteria.setLockMode,但没有成功锁定整个表。这是可能的吗?怎么做? – Werzi2001 2012-04-01 11:25:42

相关问题