2011-02-09 75 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