0

我们使用 Hibernate 和 ehcache 作为二级缓存。

如果我加载一个缓存的实体(例如 cache-usage="read-write")并更新它,似乎这会立即导致 SQL UPDATE。

(如何)我可以影响这个 SQL UPDATE 的发生时间吗?

        hibSession = HibernateUtil.getReadWriteSession();
        tx = hibSession.beginTransaction();
        User u = (User) hibSession.load(User.class, user_id);
        u.modify();
        hibSession.update(u);
        tx.commit();

编辑:似乎设置CacheMode应该有效果,但是每个 hibSession.update() 都会导致立即 SQL UPDATE,无论我设置了哪个 CacheMode。

4

1 回答 1

0

如果我加载一个缓存的实体(例如 cache-usage="read-write")并更新它,似乎这会立即导致 SQL UPDATE。

这对我来说似乎是一件非常好的事情。

似乎设置 CacheMode 应该有效果,但是每个 hibSession.update() 都会导致立即 SQL UPDATE,无论我设置了哪个 CacheMode。

SQL UPDATEs 在会话刷新时执行(当 tx 在这里提交时),这只是预期的行为。我没有看到任何CacheMode可以改变这一点的东西,我真的不明白你为什么要改变这种行为。我的意思是,您希望何时执行更新?交易之外?我肯定错过了什么。你能澄清一下吗?


更新:看来问题是关于 Write-Behind 缓存。因此,引用Terracotta 的 Hibernate Integration来澄清:

后写缓存

当你想到缓存时,你会想到这些缓存策略:Read-Through Caching、Write-Through Caching、Write-Behind Caching。Hibernate 二级缓存是 Read-Write-Through Cache,如果发生缓存未命中,则从数据库中读取实体,然后将其移交给缓存以供后续访问。但是 H2LC 不是 Write-Behind 缓存。使用 Terracotta 的磁盘持久性和异步模块,对于某些用例实现后写将非常有效。目前 Hibernate 只是直接写入数据库。相反,如果将其修改为写入二级缓存和持久异步数据库队列,这将减少延迟并显着提高吞吐量。

Write-Behind 并不是 Hibernate 当前的工作方式。

于 2010-05-05T23:29:58.933 回答