控制何时在ehcache的d类上执行SQL UPDATE

时间:2010-05-05 08:53:34

标签: hibernate caching ehcache

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

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

(How)我可以影响这个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。

1 个答案:

答案 0 :(得分:0)

  

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

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

  

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

当会话刷新时(在此处提交tx时)执行SQL UPDATE,这只是预期的行为。我在CacheMode中没有看到任何可以改变这种情况的内容,我真的不明白你为什么要改变这种行为。我的意思是,你什么时候想要更新UPDATE?交易之外?我肯定错过了什么。你能说清楚吗?


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

  

写入隐藏

     

当你想到缓存时,你会到达   这些缓存策略:Read-Through   缓存,直写缓存,   写缓存。 Hibernate Second   级别缓存是读写通过   缓存,如果发生缓存未命中,   从数据库中读取实体然后   随后交给缓存   访问。 但是H2LC并不是落后的   缓存即可。有了Terracotta的磁盘   持久性和异步模块   它真的很有效率   某些用例要实现   后写。 目前正在进行Hibernate   直接写入数据库。代替   如果将其修改为写入第二个   级别缓存和持久性   async-database-queue,这样会   减少延迟和增加   吞吐量显着。

Write-Behind不是Hibernate目前的工作原理。