`
Qieqie
  • 浏览: 337804 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

hibernate如何自动利用MemCached的getMulti能力?

阅读更多
我对使用Hibernate+MemCached有一点未解决考虑:

MemCached背景:使用MemCached保存从数据库select出来的某些数据,MemCached作为应用程序和数据库某些数据之间的一个存储中间级。

应用背景:在使用Hibernate时,实现Hibernate二级缓存接口插入到Hibernate中,通过实践,能够轻松将MemCached和Hibernate进行结合应用到实际应用中。


现在转入正题:

hibernate如何才能*自动*充分利用MemCached提供getMulti能力?

    如果使用了本地的二级缓存(e.g:OSCache,EHCache),利用query.iterate一般能够提高系统的性能,因为iterate返回Iterator后,调用Iterator.next返回对象后(这是还没有去查找命中或select该主键对应数据行),获取他属性时会从二级缓存里查找是否命中,因为这个查找是本地查找,所以效率比较高。

  OK,我的问题是:

     1)如果我使用的是需要网络行为的MemCached,我照本宣科地,调用Iterator.next,访问其属性时,应用程序通过网络访问MemCached,查找是否命中。假如最好情况我每次next都命中,这是最好的。可是有多少个对象,就有多少次网络访问。这样似乎并不划算,可能比直接query.list更慢。

     2)如果我每次都只是调用Iterator.next时,把id纪录下来,放到数组中,再把这个数组传给MemCached,去查看这些数据是否命中,这样可以只有一次网络访问(假如只有一台MemCached)。这样解决了多次网络访问的问题,可是却不是hibernate的自动行为,这很没意思,因为:
           a)没有命中,怎么办?自己再去session.load对象?
           b)命中了,又能怎么样?命中了的这些数据现在并不是Hibernate管理的!


  

分享到:
评论
6 楼 hqman 2007-08-10  
是否有做过 query list 和Iterator 性能对比?
5 楼 imjl 2007-06-06  
提示下吧

分层次,,,全局,局部,个体


关于性能,多想无义,先根据需求设计,搭建,寻找瓶颈,解决。
4 楼 yfmine 2007-05-09  
Qieqie 写道
如果我每次都只是调用Iterator.next时,把id纪录下来,放到数组中,再把这个数组传给MemCached,去查看这些数据是否命中,这样可以只有一次网络访问(假如只有一台MemCached)。

怎么才知道本次next了,是不是就要取出对象立即使用呢...或者说,怎么判断next结束了,我不会再next了...
3 楼 piaoling 2007-05-09  
兄弟,你长得太像我同学了.晕倒~~
2 楼 Qieqie 2007-05-08  
〉〉〉Robbin头像变化好大阿~~~惊吓了一下

目前我在重新思考一个产品的重新架构,该项目不是一个互联网项目,而是一个XXX监控项目。

项目的背景:
各种监控设备开启时候需要进行注册(就像手机开机时总是要找个基站注册一样,或类似互联网站的登录操作),设备数量为千至万的级别,他们注册到不同的“基站”中,由基站再统一连接到中心服务器上(java程序,协议为http based,多台集群布属)。注册要牵扯到不少表/对象,不仅仅只是设备对象,而且系统要求设备注册要非常快。设备运行时,总是不时会发生各种安全报警、故障报警、状态报警发送到“基站”,由“基站”转发到中控服务器。发生报警时候,若有预设预案,则设备按照该预案执行响应。预案是操作员事前在中控服务器上定制,在设备注册时返回给设备的。还有一部分操作员,就是整天盯着监控客户端,实时人工处理警报,同时他们还会处理一些小量请求,比如偶尔调整一下设备基本信息(如GIS信息),增加一个设备,增加一个用户,注释一下各种报警事件等等。


对于这样的项目,我计划采用如下策略进行重新架构:

1、所有的设备注册、操作员登录等会话信息使用database+memcached记录保存,把Memcached作为session中心。
2、又因为设备基本信息,人员基本信息,预案,结构/部门,基础字典数据 都是非经常变动的,结合Hibernate使用本地二级缓存(因为:不存在频繁变更数据导致缓存同步广播风暴的问题)
3、对于报警事件,则使用自己的设计,设计一个池,来了报警则先放到内存池中(除非超过数量限制),由其他线程控制负责插入到数据库。防止报警突增导致类似DOS现象。
4、对于操作人员等一些小数据量的操作,则直接insert到数据库。


使用memcached作为session中心,Robbin已经阐述了这种用法,也非常适合我的情况。

hibernate二级缓存方面,在这个项目中,使用本地缓存而非memcached的理由:
1、数据变更并不频繁(就这个项目而言,这是和互联网最大的区别之一)
2、响应必须非常快(我担心memcached可能在多次网络方面不满足要求--也仅仅只是担心而已,还没有实验)

哪些方面还不足呢?
1 楼 robbin 2007-05-08  
我觉得你没有必要刻意去减少访问memcached的网络通讯次数问题。我自己做过压力测试,表明Java应用程序和memcached网络通讯造成的系统开销微乎其微。

使用memcached,那么意味着你的Java应用层已经使用了cluster了,在cluster的场景下,系统的瓶颈肯定不会是应用层,因为应用层的cluster只要保持SNA,就理论上可以无限水平扩展。因此系统架构的终极目标就是要尽量减少对数据库的单点压力。

也许1+n次查询,因为多次网络通讯,使得单次页面请求的响应时间稍微下降,但是代价是能够尽可能减轻了对数据库的负担了,那么从整体架构,或者说整个应用性能的角度来说,明显有所提高。

相关推荐

Global site tag (gtag.js) - Google Analytics