原则上尽量避免分布式事务,所以建议采取开源的cache技术来实现同步,比如redis等技术。
如果确实需要增加local cache和remote cache机制,则建议采用开源的cache同步技术来实现,比如jgroups,目前最代码已经增加了通过jgroups通知多台tomcat实例更新本地ehcache的机制。
jgroups-udp.xml
<config>
<UDP mcast_addr="228.10.10.10" mcast_port="45588"
mcast_send_buf_size="2097152" mcast_recv_buf_size="2097152"
ucast_send_buf_size="4194304" ucast_recv_buf_size="2097152" bind_port="3233" />
<PING timeout="2000" />
<MERGE2 min_interval="5000" max_interval="10000" />
<FD_SOCK />
<VERIFY_SUSPECT timeout="1500" />
<pbcast.NAKACK retransmit_timeout="2400,4800" />
<UNICAST/>
<FRAG />
<pbcast.STABLE desired_avg_gossip="20000" />
<pbcast.GMS join_timeout="5000" print_local_addr="true" />
<pbcast.STATE_TRANSFER />
</config>
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- http://ehcache.org/ehcache.xml -->
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false"
monitoring="autodetect">
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
properties="file=jgroups-udp.xml" />
<diskStore path="/data/ehcache/cachetmpdir" />
<defaultCache maxElementsInMemory="1000" eternal="true"
overflowToDisk="false" memoryStoreEvictionPolicy="LRU" statistics="false" /><cache name="entity" maxElementsInMemory="1000" eternal="true"
overflowToDisk="false" memoryStoreEvictionPolicy="LRU" statistics="false">
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
properties="replicateAsynchronously=true, replicatePuts=true,
replicateUpdates=true, replicateUpdatesViaCopy=false,
replicateRemovals=true" />
</cache>
</ehcache>
比如findById这个方法增加了ehcahe的注解机制
@Override
@Caching(cacheable = { @Cacheable(value = "entity", key = "#root.target.key(#p0,#p1)", condition = "#root.target.condition(#p1)", unless = "#result == null") })
public T findOneById(final long id, Class<T> clazz) {
Specification<T> specification = new Specification<T>() {
@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query,
CriteriaBuilder criteriaBuilder) {
Predicate _id = criteriaBuilder.equal(root.get("id"), id);
return criteriaBuilder.and(_id);
}};
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<T> cq = builder.createQuery(clazz);
Root<T> root = cq.from(clazz);
Predicate predicate = specification.toPredicate(root, cq, builder);
cq.select(root).where(predicate);
T t = null;
try {
t = em.createQuery(cq).getSingleResult();
} catch (Exception e) {
logger.error("###Fail to findOneById() id:" + id + " clazz:"
+ clazz + " Exception:" + e.getMessage());
}
return t;
}
参考资料:
spring整合ehcache的入门级别demo分享,通过junit来测试
- 等 最代码怎么获取牛币啊?
- 完 谁来告诉我最代码上线的时间,答对者给5牛币,先来先得
- 等 牛友们,大家好,你们做程序员多久了?现在还好吗?
- 完 在微信打开的页面里进行app下载
- 等 最代码2014年欢乐聚声会
- 完 mysql如何查询表数据并且对3个字段降序的SQL?
- 完 最代码牛币机制改革
- 完 成功的在bae上使用了自定义运行环境 jetty+nginx的组合,大家对jetty+nginx优化有哪些心得?
- 完 进来分享一下各位牛牛是如何加入最代码大家庭的?
- 等 为什么java BufferedImage类处理大图直接抛出内存溢出的异常?
- 等 最代码是否开发手机app客户端?
- 完 java程序员学习哪些java的技术?java有哪些框架?都能做哪方面的开发?
- 等 php格式网页文件怎么运行?
- 等 Java volatile值获取的问题
- 等 前端vue,拦截了登录后台后,返回的token,requests拦截token,但是发送请求的时候,就出现跨越异常
- 等 大专本科计算机科班怎么找到Java工作?
- 等 eclipse怎么把三个java swing游戏项目合成一个项目?
- 完 伙伴们,大家都有什么好的解压方式么,分享一下~
- 完 三四线城市,6、7k,运维工作,索然无味,想去辞职上培训,各位牛牛有什么建议嘛
- 等 jsp页面输入中文变成问号
- 等 JPA在线上运行一段时间后报错Caused by: java.lang.IncompatibleClassChangeError: null
- 等 PHP 这个规则用preg_match_all怎么写
- 等 大佬们,有没有知道Alfresco如何配置LDAP登录呢?
- 等 php的install目录是框架带的吗?
- 完 如何实现更新数据库的时候同步更改缓存信息?
- 完 eclipse中如何有效的清空项目缓存?
- 完 微信浏览器url缓存问题?
- 完 如何实现客户页面浏览器缓存自动刷新?
- 完 ehcache如何对复杂不定条件的java查询方法进行缓存?
- 等 学习java HttpServlet源码缓存资源的问题
- 等 ssh怎么配置一级缓存或者二级缓存?
- 完 redis单点认证系统缓存怎么控制用户登录超时和关闭浏览器?
- 完 spring整合ehcache缓存框架如何使用@Cacheable注解更新数据库查询结果?
- 等 redis主从同步启动从库出现的错误如何解决?
- 等 ie8 XDomainRequest post跨域如何实现同步请求?
- 完 如何实现sqlserver中的部分表的数据定时同步到oracle