我对 Hibernate 很陌生,我正在学习 Hibernate 中的一级缓存。我担心一级缓存一致性。
假设我有两个独立的 Web 应用程序,它们可以读取/写入同一数据库。这两个应用程序都使用 hibernate 。第一个应用程序包含以下代码段。
//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 点创建 session 。第一个应用程序使该 session 对象保持 Activity 状态 10 分钟。同时,上午 10 点 01 分,第二个应用程序对数据库进行更新(更新 CLIENT set name = 'Kumar' where id = 77869
)。
因此,第一个应用程序中的一级缓存在上午 10.01 点后就已过时。我对吗?如果是这样,有什么方法可以避免这种情况吗?
最佳答案
您的第一个应用程序没有隐式方式了解第二个应用程序触发的底层更改。
处理这种情况的可能方法之一如下:
1) 一旦其中一个应用程序更新/插入,它需要在数据库中保存某种标志,例如数据已更改。
2) 在另一个应用程序中,您在开始新 session 后需要检查该标志是否已设置,因此数据是否已更改。
如果是这样,您需要相应地设置 session 的CacheMode
:
session.setCacheMode(CacheMode.REFRESH);
这将确保在此 session 期间所有查询的实体不会从缓存中获取,而是从数据库中获取(因此会在此过程中更新缓存)。这很可能不会更新第二级更改中的所有更改,您需要时不时地定期设置该 session 属性。
请记住,二级缓存除了字典实体之外的任何其他不会真正改变的东西在一致性方面都是很棘手的。
关于java - 当两个单独的应用程序使用同一个数据库时,Hibernate 一级缓存结果是否会过时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57302687/