【问题标题】:Hibernate LockOptions with timeout休眠 LockOptions 超时
【发布时间】:2017-04-20 22:23:22
【问题描述】:

我的项目已经为 hibernate 3.3.2.GA 版本锁定了一个行机制,我们计划升级到 hibernate 5。我打算让这个查询在旧的 hibernate 和新的版本中也能工作。

这是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 / 5 版本时,超时不起作用,如果表已经在会话中锁定,它会永远等待获取锁。

在使用相同代码的休眠 4 中,我尝试以这种方式替换锁定和超时 query.setLockOptions(new LockOptions(LockMode.UPGRADE).setTimeOut(100));

它仍然无法超时工作。

我也尝试了另一种方法。

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

它正在执行 select.. 以进行更新,但我执行时不遵守超时。

目前我手头的唯一解决方案是覆盖休眠 oracle 方言并将shouldUseFollowOnLocking() 设置为返回 false,这也会获得锁定和荣誉超时。

我想知道为什么休眠的 Lockoptions 超时不遵守相同的规定。如果有人对休眠中的锁和超时有任何想法,请帮助,谢谢。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    如果您被允许在项目中扩展休眠方言,我还找到了替代解决方案,该解决方案适用于不同的休眠版本。你可以用这种方式覆盖

    public class Oracle10gDialectExtension extends Oracle10gDialect implements DialectExtension
    {
    
        @Override
        public boolean useFollowOnLocking()
        {
            return false;
        }
    }
    

    【讨论】:

      【解决方案2】:

      在尝试了一些可能的方法后,我发现这种方式我们可以将与休眠 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))
      

      【讨论】:

        猜你喜欢
        • 2012-03-31
        • 2018-11-05
        • 2010-12-29
        • 2012-05-28
        • 2015-10-15
        • 2012-01-06
        • 2022-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多