繁体   English   中英

Spring @Transactional是否使用任何Hibernate缓存?

[英]Does Spring @Transactional use any Hibernate cache?

@Transactional
public MyEntity getEntity(long id) {
    return dao.findOne(id);

    //or select and update as well
}

每次调用事务方法时:我是否会从hibernate获取任何缓存实体(第一次除外)? 或者我是否总是从DB获取新鲜的实体?

这很重要,因为我将有两个独立的应用程序将共享相同的数据库,我想确保hibernate不返回任何缓存的实体,而另一个应用程序可能已经在后台更新了DB中的相同实体。

如果这是服务层的事务边界,那么Hibernate将创建一个新的Session,这意味着第一级缓存中没有任何内容。 如果您尝试在同一服务方法中调用两次findOne方法,则第二次调用将从缓存中获取实体。

连续的服务方法调用(例如getEntity)总是以新的Hibernate会话结束,因此从数据库加载一个新的实体。

如果您使用二级缓存并为此实体激活它,那么Hibernate将始终首先点击缓存并在缓存未命中时回退到数据库加载。

要防止数据完整性异常,请考虑使用乐观锁定

简短的回答是肯定的。
答案很简单:@Transactional所做的就是为你提供一个休眠会话,并开始/提交一个事务,如果配置的话。 它不关心会话是否启用了缓存。 缓存由会话在内部完成。
所以你需要的是理解hibernate缓存:
默认情况下启用一级缓存(每个会话),您无法禁用它,
默认情况下,二级缓存(每个SessionFactory)是禁用的,请参见此处如何启用Ehcache(只有@Cache带注释的实体最终在二级缓存中)。
无论@Transactional是打开新会话,还是将重用现有会话,都是可配置的,它取决于CurrentSessionContext实现。 您可以插入自己的实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM