如何通过外部更新保持你的hibernate levell 1缓存一致?

Way*_*der 4 java mysql orm caching hibernate

请原谅我这个问题,但到目前为止我无法通过我的研究找到任何解决方案.(至少没有任何帮助过我)

我的情况:

  • 我正在使用hibernate进行vaadin webservice
  • Web服务正在上传文档,并通过我的MySQL数据库中的hibernate将它们保持不变
  • 后台中的计算服务(后来可能在另一台服务器上的单独进程)对上载的文档执行计算任务,并在数据库中再次添加结果
  • Web服务识别数据库中的分析结果并将其显示给用户

我的问题:

  • 我的问题是1级休眠缓存
  • 计算服务启动后,他不会在以后更新的文档上计算任何内容,因为它们在完成给定的搜索查询时不会出现在缓存中.
  • 我的webservice覆盖了计算服务器中的更改,因为它对它也一无所知.

我知道hibernate 1级缓存负责这种行为(顺便说一下lvl 2缓存不活跃).

到目前为止我尝试过的

  • 我已经阅读了很多内容并尝试了几种方法,例如在各个地方调用session.clear().这经常给我"会话已关闭"的例外并没有帮助我(虽然我读到人们提到这有助于他们的问题)

  • 我试图确保会话总是在最后关闭,但这并没有解决问题,以及我读到我不需要手动关闭会话,无论如何,在我使用transaction.commit()之后(我听说这是每个请求模式的会话标准)

  • 我尝试关闭我的sessionfactory并在每次我的计算服务需要搜索数据库时重新打开它.如果我也在我的Web服务上执行此操作,这部分工作并且可能已满,但这对我来说似乎不是一个非常好的解决方案(也是内存消耗,不是吗?)

  • 我尝试添加

<property name ="hibernate.connection.isolation"> 2 </ property>

到我的hibernate.cfg.xml,但这也只是部分工作.使用这个我的计算服务完成了计算任务,但每次通过Web服务上传新数据时,他的更改都会被覆盖.因此,检测到新的上传,但是一旦到达新的上传,所有已分析的文档将再次被分析.

我一直在考虑管理会话的方式是否不正确.我的类DAO有两个方法,它们在事务的每个开头和每个结尾都被调用.

public abstract class DAO {

/**
 * Returns the current hibernate session. Also takes care that there's
 * always an open hibernate transaction when needed.
 * 
 * @return Current hibernate session
 */
public static Session getSession() {
    Session currentSession = HibernateUtil.getSessionFactory()
            .getCurrentSession();
    if (!currentSession.getTransaction().isActive()) {
        currentSession.beginTransaction();
    }

    return currentSession;
}

/**
 * Closes the current hibernate session, if there is one.
 */
public static void closeSession() {
    Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
    if (sess.getTransaction().isActive()) {
        sess.getTransaction().commit();
    }
    ThreadLocalSessionContext.unbind(HibernateUtil.getSessionFactory());
}

}
Run Code Online (Sandbox Code Playgroud)

我也读过一些关于使用hibernate的乐观锁定的东西,但我不确定这是否能解决我的问题.我读到如果缓存对象不是数据库中的缓存对象,乐观锁定只会抛出异常.但它是否还加载(刷新)缓存呢?

你是如何在你的休眠中处理这个问题的?你有什么建议我可以做什么或做什么我甚至在我的DAO级别做错了什么?我也对代码示例感到高兴.再说一遍:我希望每个进程都知道另一个进程在数据库中所做的更改.(如果可以的话,我甚至会禁用第一个缓存,但因为这是不可能的)

非常感谢每一个答案,并认为你与我分享

Ger*_*gyi 5

附加的对象实例仅存Session在于Hibernate中.如果正确终止事务和会话,将清除1级缓存.您使用什么模式进行会话管理?会话中的视图?

我问这个,因为你的问题在我看来就像会话终止问题.

编辑:

我的代码中没有看到Session.close()或至少Session.disconnect().据我所知,unbind()并不是自动的.