簡體   English   中英

Java SE應用程序中的休眠並發問題

[英]Hibernate Concurrency issue in Java SE application

我正在構建一個由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緩存的方式可能會導致數據不一致,因此它是分布式的因此需要分布式緩存

這是您的系統外觀

在此處輸入圖片說明

要么

或者,您可以有一個中央的Memcache服務器,每個客戶端(在memcached client的幫助下)都將使用該服務器。 (所有用戶使用一個memcached)

基本要求是, 一個用戶/會話工廠提交更改對於其他用戶/會話工廠應該是可見的,以便利用緩存。 您提供的代碼示例沒有幫助,因為它將在每次提交事務時清除L2緩存。 無論如何,這是由L2緩存或會話緩存完成的

所以我的建議是

  1. 根本不使用L2緩存,因此沒有本地內存緩存。 您不會在任何事務中都利用它,因為在每次事務處理后都要清理緩存。
  2. 如果完全需要二級緩存,則使用分布式緩存(這有點復雜),或者全部使用一個內存緩存服務器。

請同時檢查此鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM