2011-02-09 3 views
2

Я пытаюсь использовать кэширование записи Ehcache для записи партий транзакций в мою базу данных. Мне нужно, чтобы кеш-запись оставил транзакции с 5-секундными интервалами (или чаще).Ehcache write-behind кэширование приоритета потока

Должно быть, что-то не хватает, потому что стараюсь, как я мог, это просто не сработает. Я настроил кэширование с записью, а затем загрузил сервер. Тысячи, а затем сотни тысяч транзакций позже, и после ожидания несколько минут в базе данных все еще нет. Пока я не отключу нагрузку на сервере, кэш начинает писать в базу данных.

Проблема с приоритетом потока? Есть ли способ изменить 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

Хммм ... это действительно странно. Мы проводили обширное тестирование и никогда не сталкивались с тем, что нить писателя никогда не получала процессорное время. В какой ОС вы работаете? Является ли поток, создающий CacheManager работающим с меньшим приоритетом?

Кроме того, извините за то, что, возможно, попросил очевидного, но когда вы говорите «выключите» нагрузку, что это значит? Не закрыть приложение (и CacheManager)? В основном, что я спрашиваю: «Демаркация транзакций происходит внутри метода writeAll/deleteAll?» ...

Последнее замечание, так как это связано с спящим режимом, вы не настроили запись в спящем режиме Кэш второго уровня правильно? Это просто неправильный тег, не так ли?

+0

Это в среде Linux/Tomcat. Мы нигде не указали нить приоритета. Закрывая нагрузку, я имею в виду, что я закрываю потоки jMeter, которые я использую, чтобы попасть на сервер. И, наконец, мы используем hibernate, согласно документации ehcache: http://ehcache.org/documentation/hibernate.html. Как ни странно, даже после того, как я отключил загрузку на сервере, мне нужно подождать еще 5 минут, прежде чем начнутся записи в базу данных. Спасибо за вашу помощь. – Tinclon

+0

Я смущен, поэтому server.db.model.Request хранит данные в спящем режиме? Я имею в виду, что вам известно, что вы не должны использовать ehcache write-behind с кэшами спящего режима, не так ли? Кроме того, какую версию вы используете? Кроме того, это ehcache отдельно? Не Терракотовая кластеризация ... –

Смежные вопросы