2011-02-09 72 views
2

我試圖使用Ehcache寫後緩存來將批處理事務寫入我的數據庫。我需要的是後寫緩存以5秒的時間間隔(或更頻繁)轉儲事務。Ehcache寫後緩存線程優先

我必須錯過一些東西,因爲儘可能地嘗試,它就是行不通的。我設置了後寫緩存,然後將加載到服務器上。成千上萬,然後幾十萬的交易,等待幾分鐘後,數據庫中仍然沒有任何東西。直到我關閉服務器上的負載後,緩存纔開始寫入數據庫。

這是線程優先級的問題嗎?有沒有辦法修改Ehcache來執行數據庫寫入,即使服務器處於負載下?

這裏是我的配置:

<cache name="server.db.model.Request" 
maxElementsInMemory="10000" 
eternal="false" 
timeToIdleSeconds="5" 
timeToLiveSeconds="5" 
overflowToDisk="false" 
memoryStoreEvictionPolicy="FIFO"> 
    <cacheWriter writeMode="write_behind" maxWriteDelay="5" rateLimitPerSecond="5" 
    writeCoalescing="true" writeBatching="true" writeBatchSize="5000" 
    retryAttempts="2" retryAttemptDelaySeconds="10"> 
     <cacheWriterFactory class="server.db.util.RequestCacheWriterFactory"/> 
    </cacheWriter> 
</cache> 

感謝。

回答

0

最後,將我的配置更改爲這是有效的 - 雖然我仍然不確定哪個參數更改造成差異。

<cache name="server.db.model.Request" 
    maxElementsInMemory="10000" 
    maxElementsOnDisk="0" 
    eternal="false" 
    timeToIdleSeconds="5" 
    timeToLiveSeconds="5"> 
     <cacheWriter writeMode="write_behind" maxWriteDelay="5" 
     writeCoalescing="false" writeBatching="true" writeBatchSize="5000" 
     retryAttempts="2" retryAttemptDelaySeconds="10" 
     notifyListenersOnException="false" writeBehindMaxQueueSize="10000" 
     writeBehindConcurrency="10" > 
     <cacheWriterFactory class="server.db.util.RequestCacheWriterFactory" /> 
     </cacheWriter> 
</cache> 
0

嗯......這真的很奇怪。我們一直在做廣泛的測試,從來沒有經歷過寫作線程永遠不會獲得CPU時間。你在運行什麼操作系統?創建CacheManager的線程是否以較低的優先級運行?

此外,抱歉可能會問明顯,但當你說「關閉」負載這是什麼意思?不關閉應用程序(和CacheManager)?基本上我問的是「事務劃分在writeAll/deleteAll方法中發生了,對吧?」...

最後一句話也是,因爲這是用hibernate標記的,您沒有在休眠時配置寫入後臺二級緩存權利?這只是一個錯誤的標籤,不是嗎?

+0

這是在Linux/Tomcat環境中。我們沒有明確地設置線程優先級。通過關閉負載,我的意思是我關閉了我用來擊中服務器的jMeter線程。最後,根據這裏的ehcache文檔,我們使用hibernate:http://ehcache.org/documentation/hibernate.html。奇怪的是,即使我關閉了服務器上的負載之後,在開始寫入數據庫之前,我還得等5分鐘左右。謝謝你的幫助。 – Tinclon 2011-02-09 16:47:23