使用ehcache时如何持久化数据到磁盘,并且在应用服务器重启后不丢失数据
2015-03-30 14:56
453 查看
1、如何持久化到磁盘
使用cache.flush(),每次写入到cache后调用cache.flush() ,这样ehcache 会将索引(xxx.index)回写到磁盘。这样就不用担心程序是否非正常退出导致缓存丢失了。
2、附上配置文件修改:
2015-03-10 10:44:28,469 WARN net.sf.ehcache.config.CacheConfiguration.warnMaxEntriesLocalHeap(CacheConfiguration.java:1601) - Cache: submitProcessInst has a maxElementsInMemory of 0. This might lead to performance degradation or OutOfMemoryError at Terracotta
client.From Ehcache 2.0 onwards this has been changed to mean a store with no capacity limit. Set it to 1 if you want no elements cached in memory
3、系统初始化时添加:
System.setProperty(net.sf.ehcache.CacheManager.ENABLE_SHUTDOWN_HOOK_PROPERTY,"true");
4、在web.xml添加listener,让应用程序关闭时通知ehcache
5、修改ehcache源码,让它不会轻易删除index文件,因为index文件若删除了,cache数据就会清零。
修改ehcache源码中的 net.sf.ehcache.store.disk.DiskStorageFactory类中的 DiskStorageFactory 方法,注释最后else if 的代码
另外,持久化到硬盘的对象都需要是可序列化的,用以下方法处理:
a)如果类是你自己的,把他设置成可序列化
b)如果类中的某些属性是是第三方jar包的类,可以将它的字段设置成transient(不需序列化)
c)如果类中的某些属性是是第三方jar包但你一定要将所有属性都序列化,可以考虑将这些属性转化成json等
ehcache版本:ehcache-core-2.5.2.jar
集群中使用ehcache
http://www.ibm.com/developerworks/cn/java/j-lo-ehcache/ http://www.cnblogs.com/yangy608/archive/2011/10/07/2200669.html
使用cache.flush(),每次写入到cache后调用cache.flush() ,这样ehcache 会将索引(xxx.index)回写到磁盘。这样就不用担心程序是否非正常退出导致缓存丢失了。
2、附上配置文件修改:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" name="ehcache"> <cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=manual"/> <diskStore path="d:/ehcache"/> <cache name="submitProcessInst" maxElementsInMemory="1" eternal="true" overflowToDisk="true" diskSpoolBufferSizeMB="10" maxElementsOnDisk="1000000" diskPersistent="true" memoryStoreEvictionPolicy="LRU"> <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" /> <!-- 比一般配置多了这个 --> <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/> </cache> </ehcache>注意:当不需保存数据在内存中时,将maxElementsInMemory="1",而不是0,设置为0时,可以看到ehcache有warning:
2015-03-10 10:44:28,469 WARN net.sf.ehcache.config.CacheConfiguration.warnMaxEntriesLocalHeap(CacheConfiguration.java:1601) - Cache: submitProcessInst has a maxElementsInMemory of 0. This might lead to performance degradation or OutOfMemoryError at Terracotta
client.From Ehcache 2.0 onwards this has been changed to mean a store with no capacity limit. Set it to 1 if you want no elements cached in memory
3、系统初始化时添加:
System.setProperty(net.sf.ehcache.CacheManager.ENABLE_SHUTDOWN_HOOK_PROPERTY,"true");
4、在web.xml添加listener,让应用程序关闭时通知ehcache
<listener> <listener-class>net.sf.ehcache.constructs.web.ShutdownListener</listener-class> </listener>
5、修改ehcache源码,让它不会轻易删除index文件,因为index文件若删除了,cache数据就会清零。
修改ehcache源码中的 net.sf.ehcache.store.disk.DiskStorageFactory类中的 DiskStorageFactory 方法,注释最后else if 的代码
另外,持久化到硬盘的对象都需要是可序列化的,用以下方法处理:
a)如果类是你自己的,把他设置成可序列化
b)如果类中的某些属性是是第三方jar包的类,可以将它的字段设置成transient(不需序列化)
c)如果类中的某些属性是是第三方jar包但你一定要将所有属性都序列化,可以考虑将这些属性转化成json等
ehcache版本:ehcache-core-2.5.2.jar
集群中使用ehcache
http://www.ibm.com/developerworks/cn/java/j-lo-ehcache/ http://www.cnblogs.com/yangy608/archive/2011/10/07/2200669.html
相关文章推荐
- ehcache时如何持久化数据到磁盘,并且在应用服务器重启后不丢失数据
- 使用ehcache持久化数据到磁盘 并且在应用服务器重启后不丢失数据
- 如何测试备份软件在关键应用上不丢失数据
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEvent
- 问题8:如何在应用表空间中的数据文件损坏或者丢失的情况下进行恢复?
- 本文示例如何使用SAP FTP Function将文件从应用服务器传输到另外一个FTP服务器上。
- 【Android数据加密与完整性校验之RSA加密算法】Android应用开发中如何使用RSA加密算法对数据进行校验
- Android应用开发中如何使用RSA加密算法对数据进行校验
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEvent
- websphere服务器,如何使用jndi数据源
- android视频开发之一Android 如何使用juv-rtmp-client.jar向Red5服务器发布实时视频数据
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterF
- 如何得到应用的context以使用这个context 得到应用的安装目录下的files目录,将一些数据存储在这里
- 工具推荐:如何部署使用“远程桌面Web连接”,并且扩展它,可以连接非3389端口的远程桌面,(服务器管理员必备)
- 如何在V8中带入的数据使用服务器自动增加的值
- 阿里云服务器数据盘挂载后如何使用
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterF
- android开发 如何通过web服务器访问MYSQL数据库并且使其数据同步到android SQLite数据库?