休眠LockOptions超时
问题描述:
我的项目有锁定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,同时获得锁定和荣誉超时。
我想知道为什么超时在休眠锁定选项不符合。如果任何人有任何想法锁定和超时休眠,请帮助,谢谢。
答
尝试了一些可能的方法后,我发现这种方式我们可以设置锁定超时兼容与休眠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))
答
我找到替代的解决方案,以及其中,如果你被允许在你的项目延长休眠方言与不同的休眠版本的作品。你可以覆盖这种方式
public class Oracle10gDialectExtension extends Oracle10gDialect implements DialectExtension
{
@Override
public boolean useFollowOnLocking()
{
return false;
}
}