在Oracle DB的JavaEE应用程序中使用哪种锁定机制?

时间:2013-09-17 07:08:33

标签: oracle jpa locking

我正在尝试使用JPA和Oracle DB创建多用户JavaEE应用程序。在我以前的应用程序中,我使用ReentrantReadWriteLock Java类来锁定数据资源。 现在我看到JPA支持乐观和悲观锁定,Oracle根据隔离级别自动锁定资源。
所以我想知道锁定的最佳方法是哪种?在带有ReentrantReadWriteLock的java中,使用JPA还是直接在数据库中?我是否甚至需要在java中实现额外的锁定,或者我可以简单地依赖Oracle的自动锁定机制? 谢谢你的回答。

2 个答案:

答案 0 :(得分:1)

这取决于您的应用程序需求。任何类型的锁定都有性能权衡 - 您可以交换吞吐量以获得准确性。但你还必须考虑未来的使用。只要您从未计划在当前JVM之外访问相同数据,Java锁就很棒。除非您需要锁定JVM /服务器环境中存在的资源并不同时使用,否则我不会考虑它。否则我会查看数据库锁定机制,因为这样可以在以后提供更大的灵活性和扩展,例如,如果另一个应用程序开始使用相同的数据库。因此,即使使用java锁,您仍可能需要数据库锁定机制。

悲观锁定及其变化使您的应用程序能够控制阅读陈旧数据,但对于大多数应用程序IMO来说都是过度杀戮。如果您的应用程序的用户不断地一遍又一遍地修改相同的公共数据,则使用它,这样就迫使他们等到另一个用户完成后才有意义。更常见的是乐观锁定,它允许用户不受限制地读取数据,但会阻止使用陈旧数据覆盖数据。

请参阅http://en.wikibooks.org/wiki/Java_Persistence/Locking

答案 1 :(得分:0)

对于Oracle悲观锁定是很自然的选择。因为它没有性能权衡 - 仅仅因为它被使用而且无法如何关闭它。但这意味着你的ORM框架必须按正确的顺序序列化查询 - 否则它们将陷入僵局。您将收到ORA-00060错误。从Oracle的角度来看,死锁总是由错误的应用程序设计引起的。不幸的是,ORM并没有让你控制SQL语句的排序,并且Java开发人员很难修复死锁问题。 Oracle特定的错误也是“无法访问的”#34;适用于Java开发人员。

然后与乐观锁定相反,ORM / JPA框架将抛出​​" OptimisticLockingException",应用程序将清除表单并让用户再次输入值,然后您可以重试将数据存储在数据库中