java - 如何通过外部更新使你的 hibernate 一级缓存保持一致?

标签 java mysql hibernate caching orm

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

我的情况:

  • 我正在为 vaadin 网络服务使用 hibernate
  • 网络服务正在获取上传的文档,并通过 hibernate 将它们原封不动地放入我的 MySQL 数据库中
  • 后台的计算服务(一个单独的进程,稍后可能在另一台服务器上)对上传的文档执行计算任务,并将结果再次添加到数据库中
  • 网络服务识别数据库中的分析结果并将其显示给用户

我的问题:

  • 我的问题是一级 hibernate 缓存
  • 计算服务启动后,他不会对以后更新的文档进行任何计算,因为当他完成给定的搜索查询时,这些文档不会出现在他的缓存中。
  • 我的 web 服务覆盖了计算服务器中所做的更改,因为它对此一无所知。

我知道 hibernate 1 级缓存是造成这种行为的原因(顺便说一句,2 级缓存未激活)。

到目前为止我尝试了什么

  • 我读了很多书并尝试了一些东西,例如在不同的地方调用 session.clear()。这经常给我“ session 已关闭”的异常并且对我没有帮助(尽管我读到有人提到这有助于解决他们的问题)

  • 我试图确保 session 在最后总是关闭,但这并没有解决问题,而且我读到我不需要手动关闭 session ,在我使用事务之后.commit()(我听说这是 session 中每个请求模式的标准)

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

  • 我尝试添加

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

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

我一直在思考我管理 session 的方式是否不正确。我的类 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());
}

}

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

你是如何在 hibernate 中处理这个问题的?你有什么建议我可以做什么,或者我什至在我的 DAO 类中做错了什么?我对代码示例也很满意。再一次:我希望每个进程都知道另一个进程在数据库中所做的更改。 (如果可以的话,我什至会禁用第一个缓存,但因为这是不可能的)

非常感谢您的每一个回答,并认为您是在与我分享

最佳答案

附加对象实例仅存在于 Hibernate 的 Session 中。如果你正确地终止了你的事务和 session ,一级缓存将被清除。您使用什么模式进行 session 管理? session 在 View 中?

我问这个,因为你的问题在我看来像是一个 session 终止问题。

编辑:

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

关于java - 如何通过外部更新使你的 hibernate 一级缓存保持一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11302389/

相关文章:

java - getCurrentSession 调用在 openSession 之后立即失败

java - 当我点击 Android 应用程序中的搜索按钮时,如何更新我的 View ?

Java:多维缩放?

Phpexcel 得到错误的日期

mysql - 在 MySQL 中执行插入后在 Ruby 中获取受影响的行?

java - 需要帮助设置 Spring/Hibernate Mysql 设置

java - 如何将 OID 转换为 JCE 算法名称?

java - VB.NET Web 服务客户端访问 Java Web 服务 - 连接中止

mysql - 在MySQL中编写触发器时出现语法错误

java - 配置的 Hibernate ClassNotFoundException