当前位置: 首页 > 知识库问答 >
问题:

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

陆沈浪
2023-03-14

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

共有2个答案

秦城
2023-03-14

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

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

刘俊语
2023-03-14

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

悲观锁定和它的变体给你的应用程序提供了控制读取陈旧数据的能力,但对大多数应用程序来说,这是致命的。如果您的应用程序的用户一遍又一遍地修改相同的公共数据,则使用它,这样强制他们等待直到另一个用户完成是有意义的。更常见的是乐观锁定,它允许用户不受限制地读取数据,但会防止用陈旧数据覆盖数据。

见 http://en.wikibooks.org/wiki/Java_Persistence/Locking

 类似资料:
  • 如何使android studio中的应用程序在手机锁定时工作。假设在任何紧急情况下,如果用户在手机上滑动或按下锁定按钮2次,手机锁定时,它会将其位置发送到保存的紧急号码。有什么想法吗?

  • 我将使用ADFS作为身份提供者(IDP)实现对java应用程序的单点登录。通过OneLogin找到了此解决方案SSO,并使用了其示例应用程序。除此之外,还有另一个解决方案Shibboleth。 我想知道与我的上下文匹配的最佳解决方案是什么。之间,这不是Spring应用程序。 谢谢

  • 问题内容: 在工作中,我们正在开发一个RESTful应用程序,其中的数据层将由Hibernate处理。但是我们不确定如何处理实体的更新。 我们计划执行以下操作: 1)客户端通过id请求一个实体 2)Hibernate加载该实体,将请求的字段(始终带有版本)复制到DTO,该DTO转换为JSON并发送给客户端 3)客户端管理一些字段并发送实体(版本号)返回到服务器。 4)服务器接收转换为DTO的JSO

  • 我一直在努力让我的第一个Android应用程序工作。我有一个使用webview的活动,我用它来打开上面有html表单的网页。 让“选择文件”按钮(用于文件输入)工作有些困难,但多亏了这里发布的在网络视图中上传文件的帮助,我终于解决了这个问题。从那里,我基本上使用了他们在Github上提供的主活动java代码。 我的实际问题是,当点击一个文件输入按钮时,我没有让用户使用我想要的设备摄像头的选项。起初

  • 问题内容: Swing应用程序现在真的被使用吗?我找不到使用它们的地方。可以跳过AWT和Swing包吗(尽管我学到了一些基础知识)? 问题答案: 如果您是专门为Web编写的,则可以跳过Swing,否则,您肯定会碰上它。如果没有Swing GUI,我从来没有在非平凡的Java应用程序上工作过。 另外,Swing是更好使用的API之一。如果您使用大多数其他工具,则会发现它们更加难以使用和/或与平台不兼