0

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

4

2 回答 2

1

这取决于您的应用程序需要什么。任何类型的锁定都有性能折衷——你用吞吐量换取准确性。但是您还必须考虑将来的使用情况。只要您从不打算在当前 JVM 之外访问相同的数据,Java 锁就很棒。除非您需要锁定 JVM/服务器环境中存在的资源以免被同时使用,否则我不会考虑它。否则我会考虑数据库锁定机制,因为这允许以后有更大的灵活性和扩展性,例如如果另一个应用程序开始使用同一个数据库。因此,即使您使用 java 锁,您仍可能需要数据库锁机制。

悲观锁定及其变体使您的应用程序能够控制读取陈旧数据,但对于大多数应用程序 IMO 来说已经过分了。如果您的应用程序的用户不断地反复修改相同的公共数据,则使用它,这样强制他们等待直到另一个用户完成是有意义的。更常见的是乐观锁定,它允许用户不受限制地读取数据,但会防止用过时的数据覆盖数据。

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

于 2013-09-17T13:10:02.693 回答
0

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

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

于 2013-09-17T15:25:26.290 回答