分布式Ehcache缓存配置-RMI

参考博文1:ehcache 集群使用 rmi方式 有图有真想

参考博文2:EhCache 分布式缓存/缓存集群


讲一下背景,两台服务器,pc跟移动端,一个数据库,在pc服务器上,用了Hibernate的二级缓存,但是最近老是报错,pc端删除了数据,移动端没有及时更新缓存,导致报

nested exception is org.hibernate.ObjectNotFoundException:No row with the given identifier exists:

一开始报这个错,网上说是懒加载问题,关联数据被删了之类的,然而我看了一下并不是。就跟师兄讨论,他说要用分布式缓存策略来解决,我就上网查了下,第一次用,中间出现各种没遇到的问题。然后我根据开头给的两个博客结合起来改配置文件。详情请点击查看

根据第二个篇文配置,cacheEventListenerFactory会报错,

RMI net.sf.ehcache.CacheException: Unable to load class net.sf.ehcache.boots...

应该是这个类找不到,但是ehcache明明有的,不过我改成第一篇博文中的
net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory,就好了。

先看配置文件,是在ehcache.xml里面配的:

在原来的ehcache.xml础上加入




    
    


     




	


    
    


    


    


    


    




    
	 
        
        
    
解释一下为什么是
rmiUrls=//xxx.xxx.xxx.xxx(移动服务器ip):40002/org.hibernate.cache.spi.UpdateTimestampsCache
因为查询缓存的话会抛异常:对象没有序列号异常,但是不影响程序运行,影响缓存。

因为我这边是改动数据没有及时更新缓存,所以只配了

UpdateTimestampsCache,根据需求改。


另一个服务器移动端的:
其他配置一样,只是改动


    	port=40002,
      socketTimeoutMillis=2000,
      peerDiscovery=manual,
      rmiUrls=//xxx.xxx.xxx.xxx(PC的ip):40001/org.hibernate.cache.spi.UpdateTimestampsCache"
            />


就这样完了吗?不是的,还是没解决最开始的错误。

接着尝试把它配进Hibernate里面,再把原来自己的缓存给分开,一个session-ehcache.xml(放自己的缓存配置)跟原来的ehcache.xml。然后在spring的Hibernate sessionFactory里面配:


		
			...
classpath:ehcache.xml
...

 
  

再把自己的加进去:


		  
	


再测试,可以了!

转载无需注明出处------------------------guin_guo



你可能感兴趣的:(Java,JAVA,Web,debug,Hibernate)