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

时间:2012-03-29 05:31:23

标签: java hibernate

我正在构建一个由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)和查询缓存这一事实。

1 个答案:

答案 0 :(得分:1)

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

以下是您的系统的外观

enter image description here

OR

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

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

所以我的建议是

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