我们正在使用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。
答案 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目前的工作原理。