我已经读过session.get(Employee.class, new Long(1))
方法将从缓存或数据库中获取数据。
如果有两个用户同时访问该应用程序。
如果用户 - > User1正在执行get,然后将从DB检索数据。现在数据被移动到缓存
如果用户 - > User2已删除记录或更新记录。然后
如果用户 - > User1正在执行get,然后将从缓存中检索数据。
Isnt User1正在获取旧数据。它是否属于缓存的陷阱。 或者我在这里遗漏了什么?
我可以说这就是为什么User1在同一个会话中进行了2次session.get
。但我仍然需要不同的意见。
答案 0 :(得分:0)
您理解正确:缓存绑定到会话,如果将对象加载到第一级缓存,则不会使用#get()
执行SQL。您可以使用#evict()
从缓存中清除一个对象,或#clear()
清除缓存中的每个对象,而无需关闭会话。关闭会话将始终删除整个缓存。
查看一个很好的解释here。
答案 1 :(得分:0)
您需要详细了解容器管理的实体管理器
Java EE中最常用且最广泛使用的实体管理器 environment是容器管理的实体管理器。在这种模式下, 容器负责实体的开启和关闭 经理(这对应用程序是透明的)。也是 负责交易边界。容器管理的实体 经理通过依赖注入或在应用程序中获得 通过JNDI查找,容器管理的实体管理器需要 使用JTA交易。
您想要了解和存档的内容以及如何使用它是可以应对的。 更多doucmentation Entity Mananger
答案 2 :(得分:0)
不,因为Hibernate会在缓存中保存数据,但无论您是使用Hibernate更新数据,它都会知道存在一些更改。如果使用SQL更新数据,或者Hibernate无法看到发生的事情,那么您将遇到麻烦。