gpt4 book ai didi

java - Java SE 应用程序中的 Hibernate 并发问题

转载 作者:行者123 更新时间:2023-12-01 15:28:09 25 4
gpt4 key购买 nike

我正在构建一个由 Hibernate 提供支持的 Java SE 应用程序。主要会运行许多 Java SE 实例,并且会有许多 Hibernate Session 工厂。当一台客户端计算机将对象插入数据源时,除非我清除缓存,否则其他客户端将看不到它。在这种情况下是否有更好的机制可以使用?下面是我的缓存清理方法。

public static void clearCache() {
HibernateHelper.beginTranscation();
HibernateHelper.getCurrentSession().clear();
HibernateHelper.getSessionFactory().evictQueries();
try {
Map<String, ClassMetadata> classesMetadata = HibernateHelper
.getSessionFactory().getAllClassMetadata();
for (String entityName : classesMetadata.keySet()) {
HibernateHelper.getSessionFactory().evictEntity(entityName);
}
} catch (Exception e) {
}
HibernateHelper.commit();
}

请注意,我还使用二级缓存 (Memcache) 和查询缓存。

最佳答案

您使用 L2 缓存的方式可能会导致数据不一致,因为您的应用程序正在使用多个 session 工厂,因此它是分布式的并且需要 distributed cache

这是您的系统的外观

enter image description here

或者

或者,您可以拥有一个中央内存缓存服务器,每个客户端(在 memcached client 的帮助下)都将使用它。 (所有用户使用一个memcached)

基本要求一个用户/ session 工厂提交的更改应该对其他用户/ session 工厂可见,以便利用缓存。您提供的代码示例没有帮助,因为它会在每次事务提交时清理 L2 缓存。 这无论如何都是由 L2 缓存或 session 缓存完成的

所以我的建议是

  1. 根本不使用 L2 缓存,因此没有本地内存缓存。无论如何,您都不会利用它,因为您在每次事务后都会清理缓存。
  2. 如果需要 L2 缓存,请使用分布式缓存(稍微复杂)或使用单个 memcached 服务器。

请查看this link以及。

关于java - Java SE 应用程序中的 Hibernate 并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9919592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com