2017-04-20 67 views
1

我的项目有锁定hibernate 3.3.2.GA版本的行机制,我们正在计划升级到休眠5.我打算让这个查询工作在更旧的休眠和更新的版本以及。休眠LockOptions超时

这是Hibernate 3.3.2.GA

如果该行被锁定在会议上已经这个查询将锁定该行现有的查询,将等到超时,并抛出超时如果超过。

Query query = session.getNamedQuery("select aps from WritableSchool aps where aps.schoolCd = :schoolCd"); 
query.setParameter("schoolCd", schoolCd); 
query.setTimeout(2); // seconds 
query.setLockMode("aps", LockMode.UPGRADE); 
List<WritableSchool> schools = query.list(); 

当我们升级到休眠五分之四的版本,超时工作不就永远等待锁获取如果表被锁定在会话了。

在休眠4相同的代码我想更换锁和超时这样 query.setLockOptions(new LockOptions(LockMode.UPGRADE).setTimeOut(100));

它仍然没能得到超时工作。

我尝试了另一种方式。

session.buildLockRequest(LockOptions.NONE).setLockMode(LockMode.UPGRADE).setTimeOut(2000).lock(school);

据执行选择。对于更新,但没有履行的时间了,但是我实现。

目前我唯一的解决方案是重写hibernate oracle dialect,并将shouldUseFollowOnLocking()设置为false,同时获得锁定和荣誉超时。

我想知道为什么超时在休眠锁定选项不符合。如果任何人有任何想法锁定和超时休眠,请帮助,谢谢。

回答

0

尝试了一些可能的方法后,我发现这种方式我们可以设置锁定超时兼容与休眠3.5.6到当前休眠版本无任何问题。

Session session = ((Session) em.getDelegate()); 
Query query = session.getNamedQuery("select aps from WritableSchool aps where aps.schoolCd = :schoolCd"); query.setParameter("schoolCd", schoolCd); 
WritableSchool schools = query.list().get(0); 
session.buildLockRequest(LockOptions.NONE).setLockMode(LockMode.PESSIMISTIC_WRITE).setTimeOut(2000).lock(aliasPoolSeq); 

第二种方式,但这从3.5.6和所有其他更高版本的作品。

school = (WritableSchool) session.get(WritableSchool .class, primaryKey, 
         new LockOptions(LockMode.PESSIMISTIC_WRITE).setTimeOut(QUERY_TIMEOUT_SEC * 1000)) 
0

我找到替代的解决方案,以及其中,如果你被允许在你的项目延长休眠方言与不同的休眠版本的作品。你可以覆盖这种方式

public class Oracle10gDialectExtension extends Oracle10gDialect implements DialectExtension 
{ 

    @Override 
    public boolean useFollowOnLocking() 
    { 
     return false; 
    } 
}