【问题标题】:Why Hibernate session is not reflecting changes done outside application为什么 Hibernate 会话没有反映在应用程序外部完成的更改
【发布时间】:2015-04-18 12:55:50
【问题描述】:

我正在开发一个Java 应用程序,它可以快速检查客户端数据库表中的更新,如果发现任何更新,则使用Hibernate 和MySQL 将其传输到服务器数据库。

  1. 当我们使用休眠会话更改数据库时,它运行良好但是每当我使用MySQL Workbench 更改数据库表值时,它将返回与以前一样的记录。

如何通过休眠会话更新表中的外部更改。

public List<com.ctpl.models.client.MasterTable> getAllClientMasterTableWithServerFlag() {
    try {
        clientSession = ClientHibernateUtil.getSessionFactory().openSession();
        clientSession.flush();

        Criteria criteria = clientSession.createCriteria(com.ctpl.models.client.MasterTable.class);
        criteria.add(Restrictions.eq("serverFlag", 0));

        List<com.ctpl.models.client.MasterTable> clientMasterTables = criteria.list();
        clientSession.close();
        return clientMasterTables;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

我在这里错过了什么?

【问题讨论】:

  • 您可能忘记在 MySQL 工作台中提交事务。或者您没有修改您认为正在修改的表/数据库。
  • 亲爱的@JBNizet 我非常确定数据库/表和在 MySQL Workbench 中它是自动提交的顺便说一句我也手动提交。
  • 那么您可能配置了二级缓存,并且正在从该缓存中获取陈旧值。
  • 老板@JBNizet 没有二级缓存,但我认为这是因为一级缓存,但我读过我们无法更改first-level 缓存,请提供任何其他解决方案...
  • 第一个缓存关联到 Session 实例,你的方法创建一个新的会话,所以...

标签: java mysql hibernate


【解决方案1】:

看看 Session.clear() 或 evict 方法

参考这篇文章:

http://howtodoinjava.com/2013/07/01/understanding-hibernate-first-level-cache-with-example/

希望有帮助

【讨论】:

  • 感谢您的回复@Godwin,但您对session.clear() 的想法在这种情况下不起作用。顺便说一句,它会强制 hibernate.cfg.xml 文件在每次请求时重新配置,所以我认为这不好IDEA 虽然在这里不起作用。
【解决方案2】:

我们只需要像下面这样在hibernate中添加连接池...

  1. C3P0 (Easy to implement)
  2. BonCP
  3. Tomcat JDBC Connection Pool
  4. DBPool
  5. HikariCP
  6. Proxool

找到了使用this example轻松实现它的最佳方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    相关资源
    最近更新 更多