社区
Java EE
帖子详情
使用ehcache缓存时如何解决并发问题?
berg369
2009-12-09 02:47:25
我使用ehcache做系统的缓存,先根据key判断一个对象缓存中是否存在,如果有则取自缓存并返回该对象,没有时则访问数据库查询,把查询结果put到缓存中并返回。
但是访问数据库查询将消耗一些时间,此时另一个请求进来也发现该对象不在缓存中,又访问一次数据库查询。
在更新缓存时也存在同样的问题。在更新尚未完成时,那些请求怎么办?
请问这种并发问题大家是怎么解决的?
...全文
918
9
打赏
收藏
使用ehcache缓存时如何解决并发问题?
我使用ehcache做系统的缓存,先根据key判断一个对象缓存中是否存在,如果有则取自缓存并返回该对象,没有时则访问数据库查询,把查询结果put到缓存中并返回。 但是访问数据库查询将消耗一些时间,此时另一个请求进来也发现该对象不在缓存中,又访问一次数据库查询。 在更新缓存时也存在同样的问题。在更新尚未完成时,那些请求怎么办? 请问这种并发问题大家是怎么解决的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
aaawayer
2010-03-19
打赏
举报
回复
想看看回复 ,急需解决这个问题
shine333
2009-12-09
打赏
举报
回复
是不是整个功能用来判断用户是否可以操作某个功能?
个人感觉存放形式应当改一下
cache.key roleId
cache.value ROLE对象或者Map, Map的key是 functionId
这样只要更新一个对象。
功能号被删除这个情况,我想在实际环境中出现的可能性比较小,这个时候,应该需要重新发布,重启之类,cache都失效,无需担心。
berg369
2009-12-09
打赏
举报
回复
cache中存放角色与功能号的对应,用于判断是否有权限,key形如:"roleID_functionId",当角色的权限被修改或某个功能号被删除等情况下,重建这个cache。
局部更新cache代价同样太高了,遍历所有前缀为某角色的键的缓存,或者遍历所有后缀为某功能号的键的缓存,这种方式代价太高了;
而按角色名放在不同的Cache中,当角色的权限更改时仅更新这一个cache,但又无法适应功能号的修改的情况。
berg369
2009-12-09
打赏
举报
回复
同步块内连同DB操作的时间很长了,我是把权限对应放到缓存中,需要几个表的关联查询,对权限的任何修改都更新整个Cache
shine333
2009-12-09
打赏
举报
回复
详细解释一下“更新缓存的过程很长”是
同步块内连同DB操作的时间很长?
还是单单更新cache中element的时间很长?
后者好像不太可能啊,除非用了cluster之类的。
berg369
2009-12-09
打赏
举报
回复
太感谢了,shine333讲的太清楚了,我正想问第二个问题呢,原来是用二次判断,否则光同步还不行呢
另外请教,采用同步方式时,如果同步块中更新缓存的过程很长,会降低性能的,有何思路可以避免这个问题呢?是否只能在设计缓存对象上注意避免时间过长的更新?
shine333
2009-12-09
打赏
举报
回复
至于同步机制,看情况或个人喜好。重要的是,进入同步代码之后,二次判断
shine333
2009-12-09
打赏
举报
回复
漏了很重要的一点
// 判断是否有缓存
if (cached) {
// 直接返回缓存内容
return cachedValue;
}
// 开始同步
synchronized (lock) {
// 这点刚才漏了
// 再次判断,避免在等待同步锁的过程中,别人已经先行一步读取了DB
if (isThisTimeCached) {
return cached;
}
// 读取DB
readDB();
// 存入cache
saveCache();
return cached;
}
shine333
2009-12-09
打赏
举报
回复
读数据的前同步,读完,放入缓存后解锁
高
并发
缓存
器(基于
ehcache
)
跟博客中的高
并发
缓存
器对应的代码,主要是基于
ehcache
进行代码整合,同
时
容器附带一些更新器的功能
hibernate基础教程
Hibernate中的
缓存
Hibernate中
使用
了一级
缓存
和二级
缓存
的机制来提高程序的性能. 一 为什么要
使用
缓存
?
缓存
是一块存储区域,可能是一块内存,也可能是一块硬盘.
缓存
能起到缓冲的作用,把程序经常
使用
的信息存放到
缓存
中,当需要的
时
候先到
缓存
中找 如果没有,再到数据库中去加载.从
缓存
中读取信息的速度会远远大于从数据库中读取信息的速度. 如图: (1) 没有
缓存
的情况: 写 读 (2) 有
缓存
的情况: 写 写 读 读 演示: 1、get()方法 2、load()方法 3、批量存储:session.flush()和session.clear() 二 Hibernate中的二级
缓存
结构 在Hibernate中
使用
两极
缓存
结构,第一级
缓存
是Session级别的
缓存
,Session级别的
缓存
是由Hibernate管理的,一般情况下无需进行干预.第二级
缓存
是 SessionFactory级别的
缓存
,SessionFactory级的
缓存
可以进行配置和更改. 一级
缓存
也就是Session
缓存
随着Session的关闭而消亡.二级
缓存
伴随着整个应用,也是就是伴随着SessionFactory消亡而消亡. Hibernate的
缓存
机构图如下: 三 Hibernate中的第二级
缓存
Hibernate的第二级
缓存
是SessionFactory级别的
缓存
,它被所有的Session共享. Hibernate的第二级
缓存
是一个插件,下面是几种常用的
缓存
插件:
EhCache
SwarmCache JBossCache等. 其中,
EhCache
是Hibernate的默认的插件. 四
EhCache
的
使用
第一步:修改Hibernate配置文件,启用Hibernate的第二级
缓存
.在配置文件中加入
EhCache
缓存
插件的实现类. 第二步:拷贝
ehcache
.xml文件到类路径下(位于Hibernate3的etc文件夹下) 第三步:对需要进行
缓存
的持久化对象进行配置. 第四步:编写测试类,体验Hibernate的二级
缓存
. 第五步:二级
缓存
的数据
并发
策略. 当我们
使用
二级
缓存
的
时
候,如果
并发
策略为:read-only,那么只能对持久化对象进行查询,不能对其进行修改.这是因为,Hibernate的
并发
策略 所决定的. 当我们只对数据进行查询的
时
候,可以将
并发
策略设置为:read-only. 当我们要对数据进行修改的
时
候,可以将
并发
策略设置为:read-write. 第六步:设置
EhCache
的配置文件. 数据库 二级
缓存
s 记录 PO po s1 PO 数据库 10 100
AutoLoadCache
缓存
管理
解决
方案-其他
AutoLoadCache 是基于AOP+Annotation等技术实现的高效的
缓存
管理
解决
方案,实现
缓存
与业务逻辑的解耦,并增加异步刷新及“拿来主义机制”,以适应高
并发
环境下的
使用
。 现在
使用
的
缓存
技术很多,比如Redis、 Memcache 、
EhCache
等,甚至还有
使用
ConcurrentHashMap 或 HashTable 来实现
缓存
。但在
缓存
的
使用
上,每个人都有自己的实现方式,大部分是直接与业务代码绑定,随着业务的变化,要更换
缓存
方案
时
,非常麻烦。接下来我们就
使用
AOP + Annotation 来
解决
这个
问题
,同
时
使用
自动加载机制 来实现数据“常驻内存”。
AutoLoadCache
缓存
管理
解决
方案 v7.1.0
为您提供AutoLoadCache
缓存
管理
解决
方案下载,AutoLoadCache 是基于AOP+Annotation等技术实现的高效的
缓存
管理
解决
方案,实现
缓存
与业务逻辑的解耦,并增加异步刷新及“拿来主义机制”,以适应高
并发
环境下的
使用
。现在
使用
的
缓存
技术很多,比如Redis、 Memcache 、
EhCache
等,甚至还有
使用
ConcurrentHashMap 或 HashTable 来实现
缓存
。但在
缓存
的
使用
上,每个人都
springMVC入门教程,集成了
缓存
、安全框架
springMVC做的小项目,springMVC+spring+hibernate+
ehcache
+shiro jar包全,代码也全,结构清晰明了,非常适合springMVC初学者、
ehcache
初学者、shiro初学者。shiro除了做认证以及授权外,还做了
并发
登录控制,多个人登录同一个账号,踢出前者。
Java EE
67,513
社区成员
225,879
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章