繁体   English   中英

当两个单独的应用程序使用同一个数据库时,Hibernate的一级缓存结果是否过时?

[英]Can Hibernate first level cache results be stale when two separate applications consumes same database?

我对休眠很陌生,我正在学习休眠中的一级缓存。 担心一级缓存的一致性

想象一下,我有两个单独的Web应用程序,它们可以读取/写入同一数据库。 这两个应用程序都使用休眠模式。 第一个应用程序包含以下代码段。

//First Application code 
//Open the hibernate session
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();

//fetch the client entity from database first time
Client client= (Client) session.load(Client.class, new Integer(77869));
System.out.println(client.getName());

//execute some code which runs for several minutes

//fetch the client entity again
client= (Client) session.load(Client.class, new Integer(77869));
System.out.println(client.getName());
session.getTransaction().commit();

第二个应用程序由以下代码组成。

//Second Application code 
//Open the hibernate session
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();

//fetch the client entity from database first time
String hql = "UPDATE client set name = :name WHERE id = :client_id";
Query query = session.createQuery(hql);
query.setParameter("name", "Kumar");
query.setParameter("client_id", "77869");
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
session.getTransaction().commit();

假设第一个应用程序在上午10.00创建会话。 第一个应用程序使该会话对象保持活动状态10分钟。 同时,在10.01AM处,第二个应用程序对数据库进行了更新( update CLIENT set name = 'Kumar' where id = 77869 )。

因此,第一个应用程序中的第一级缓存在10.01AM之后已过时。 我对吗? 如果可以,是否有任何方法可以避免这种情况?

您的第一个应用程序没有任何隐式方式可以知道第二个应用程序触发的基础更改。

解决这种情况的一种可能方法是:

1)一旦一个应用程序确实更新/插入,它就需要在数据库中保存某种标记,例如,数据已更改。

2)在另一个应用程序中,刚开始新会话后,您需要检查该标志是否已设置,因此数据已更改。

如果是这样,则需要相应地设置会话的CacheMode

session.setCacheMode(CacheMode.REFRESH);

这将确保在此会话期间,不会从缓存中获取所有查询的实体,而是从数据库中获取所有实体(因此将在此过程中更新缓存)。 这很可能不会更新第二级更改中的所有更改,您需要不时地定期设置该会话属性。

请记住,就字典一致性而言,除了字典实体以外,对二级缓存进行任何其他更改都不会很麻烦。

暂无
暂无

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

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