aba*_*rax 3 java concurrency hibernate ejb jpa
我目前正在研究部署到Weblogic 10.3.3的Java EJB项目.我们使用JPA 1.0和Hibernate 3.4作为实现者.我们也在使用Oracle10g方言.
我们运行的问题涉及在尝试锁定行进行更新时由hibernate生成SQL.
我们执行一个查询:
Query q = entityManager.createNamedQuery("findMyObject");
MyHibernateObject myObject= (MyHibernateObject ) q.getSingleResult();
Run Code Online (Sandbox Code Playgroud)
然后使用以下命令锁定该对象:
entityManager.lock(myObject, LockModeType.WRITE);
Run Code Online (Sandbox Code Playgroud)
此锁定操作生成查询:
SELECT myObject FROM myTable FOR UPDATE NOWAIT
Run Code Online (Sandbox Code Playgroud)
我想要它产生的是:
SELECT myObject FROM myTable FOR UPDATE
Run Code Online (Sandbox Code Playgroud)
启用其他线程来查询此对象而不抛出异常:org.hibernate.exception.LockAcquisitionException并等待轮到他们或让EJB事务超时.
所以知道这一切,我可以强制Hibernate生成没有NOWAIT关键字的SQL吗?
我知道使用Hibernate 3.6和JPA 2.0将允许使用悲观锁,但由于Weblogic仅支持JPA 1.0,我们的双手并列.
理想情况下,我希望避免编写我们自己的重试和/或超时机制,因为当我需要的只是扩充当EntityManager创建锁时Hibernate生成的SQL时,处理异常.
好的,我们正在使用解决方法,直到我们更新到Weblogic 10.3.4
在这里,以防其他人偶然发现:
SessionImpl session = (SessionImpl)entityManager.getDelegate();
session.lock(myObject, LockMode.UPGRADE);
Run Code Online (Sandbox Code Playgroud)
这当然打破了JPA标准,因为我们暴露了hibernates实现并使用了hibernate会话.
但它会产生一个
SELECT myObject FOR UPDATE
Run Code Online (Sandbox Code Playgroud)
代替
SELECT myObject FOR UPDATE NOWAIT
Run Code Online (Sandbox Code Playgroud)
希望这有助于某人.
| 归档时间: |
|
| 查看次数: |
5982 次 |
| 最近记录: |