我正在构建一个由Hibernate驱动的Java SE应用程序。主要运行的是许多Java SE实例,并且会有许多Hibernate Session工厂。当一台客户机将一个Object插入数据源时,除非我清除缓存,否则其他客户机将看不到它。在这种情况下是否有更好的机制? 以下是我的缓存清算方法。
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)和查询缓存这一事实。
答案 0 :(得分:1)
您使用L2缓存的方式可能会导致数据不一致,因为您的应用程序正在使用多个会话工厂,因此它已分发并且需要distributed cache。
以下是您的系统的外观
OR
或者,您可以拥有一个中央内存缓存服务器,每个客户端(在memcached client的帮助下)都可以使用。 (所有用户使用的一个memcached)
基本要求是一个用户/会话工厂提交的更改应对其他用户/会话工厂可见,以便利用缓存。您提供的代码示例没有帮助,因为它会在每次事务提交时清除L2缓存。 无论如何都是由L2缓存或会话缓存完成的。
所以我的建议是
请同时查看this link。