论坛首页 海阔天空论坛

绝对不虚此行的活动 - 记Gavin King上海交流研讨会

浏览 50436 次
该帖已经被评为精华帖
作者 正文
   发表时间:2007-04-19  
robbin讲的满好的,解答了我前一段时间对Hibernate做性能优化遇到的一些问题。

一个典型的例子,是在单向的一对多关系时,如果直接插入、修改、删除多这边的PO对象,则一这边的集合的二级缓存无法更新的问题。
  <set name="places" cascade="none" inverse="true" order-by="id asc" lazy="false">
      <cache usage="read-write"/>
     
    <key column="site_id"/>
    <one-to-many class="com.agilefaith.impl.site.Place"/>
  </set>
我试过无论inverse="true"还是inverse="false"都无法更新。

另外robbin说的二级缓存是解决性能问题的法宝,这个说的很对,我们做Hibernate性能优化的经验与robbin完全相同。robbin说的确实是些经验之谈。

不过Hibernate的二级缓存也存在着一些缺陷。
首先,它是以PO的id作为缓存的key来保存PO,不适合以其他属性值来查找的情况。
其次,Hibernate的二级缓存仅在对单个PO执行CRUD(add、get/load、update、remove)时才会访问。如果执行批量加载(loadAll),仍然会执行select语句。

如果经常以非id字段查找PO对象,或者经常执行批量加载,则有必要实现特定于应用的自定义缓存。也可以使用ehcache来开发,ehcache从1.2之后也可以支持集群了。
0 请登录后投票
   发表时间:2007-04-19  
robbin 写道
Gavin的演讲当中也不忘抨击了两句springframework,当然问题也说到了点子上,spring不使用OpenSessionInView的时候,确实处理lazy集合初始化在session关闭以后的问题很棘手。Gavin说EJB3没有这个问题,这引起我想试试EJB3的兴趣。


这算spring的问题么?
0 请登录后投票
   发表时间:2007-04-19  
robbin 写道
温柔一刀 写道
呵呵,Gavin King确实非常平易近人
但是偶今天就robbin的演讲听的很明白,
Gavin King讲的英文没怎么听懂,
晓刚讲的seam以前没有接触过,看到貌似又跟jsf结合的比较紧密,兴趣失了一半


我本来想现场问Gavin一个问题,问他有没有把JBoss Seam和Struts2.0整合的计划,他如果有这个计划,那我肯定对Seam很有兴趣,但一看他对JSF狂捧,然后对RoR狂踩,这问题就自己咽回去了。

当然这问题后来晓钢问了,Gavin也回答了,就是会考虑集成Tapestry。这说明Gavin对事件驱动的web框架很推崇,对MVC框架没有兴趣,答案也很清楚了,他不会考虑Struts2.0的,当然我要的答案也有了,就是我绝对不会对Seam产生兴趣的。


Gavin提了一下struts2.0,webwork 啥的,没听懂他是说会支持还是不可能支持。

另外robbin你今天说的eager-fetch 我这边根本实现不了,在many-to-one端 配不配fetch="join" 根本没有区别,都会发起 1+N条查询,不知道为什么。
0 请登录后投票
   发表时间:2007-04-19  
引用
eager-fetch 我这边根本实现不了,在many-to-one端 配不配fetch="join"

视情况而定啦。建议开新贴讨论这个问题。我理解的eager-fetch保证的是not lazy(这一定必须保证).而join是一种期望的抓取策略,并不一定能保证。
0 请登录后投票
   发表时间:2007-04-20  
daquan198163 写道
robbin 写道
Gavin的演讲当中也不忘抨击了两句springframework,当然问题也说到了点子上,spring不使用OpenSessionInView的时候,确实处理lazy集合初始化在session关闭以后的问题很棘手。Gavin说EJB3没有这个问题,这引起我想试试EJB3的兴趣。


这算spring的问题么?


lazy 的问题很早就有人抱怨说是 hibernate 的设计缺陷, 不得已才使用 OpenSessionInView, 跟 spring 应该没啥关系.   EJB3 可以做到 session 关闭后的 lazy?  莫非他能未卜先知加载 ui 上的元素,  还是根本不区分, 一股脑的加载到内存里? 
0 请登录后投票
   发表时间:2007-04-20  
可能是指在seam 这个框架下吧。
seam定义了一个粒度比session小的会话窗口。具体的思想看下
http://docs.jboss.com/seam/1.0.0.GA/reference/en/html/tutorial.html#d0e1528

1.6.3. Understanding Seam conversations
0 请登录后投票
   发表时间:2007-04-20  
庄表伟 写道
我在和dlee聊这个Seam框架,我们都相信,这种把所有的状态都放在服务器端的框架,简直就是在开“技术倒车”。

在REST+Ajax这样明显的发展趋势的大背景下,我认为,Seam不会有什么前途。

http://docs.jboss.com/seam/1.0.0.GA/reference/en/html/tutorial.html#blog

A RESTful Seam application: the Blog example
0 请登录后投票
   发表时间:2007-04-20  
现场感觉真的太棒了,难以想像J2EE社区教父level的人物这么和蔼。

不过~~ 我比较郁闷的是,居然跟另外一位同学重名了~~
谁让我自己没有名片,去的时候满世界找,最后拿了同学的名片就去了
跟Gavin King亲笔签名的书失之交臂啊~~
赶紧china-pub订购
0 请登录后投票
   发表时间:2007-04-20  
Robbin 写道

双向关联,inverse=“true”的情况下应避免使用集合缓存

这个是因为你的这个实践建议造成的:
Robbin 写道

在分层结构中通过DAO接口用session直接持久化对象,避免通过关联关系进行可达性持久化

这样就会带来内存模型和数据库模型不一致的情况

偶的实践建议是相反的:通过关联关系进行可达性持久化

在Parent上有这种方法:
add(Child child) {
  child.setParent(this);
  children.add(child);
}

remove(Child child) {
    child.setParent(null);
    children.remove(child);
}


设置inverse = true 和 cascade = all-delete-orphan
删除某个child的操作就变成一句话搞定:
parent.remove(child)


这样内存和数据库保持完美一致,而且代码写起来也简单,不需要ChildDAO上有啥create/delete/update/ Child的方法

双向关联的2级缓存也是非常好用的
0 请登录后投票
   发表时间:2007-04-20  
庄表伟 写道
我在和dlee聊这个Seam框架,我们都相信,这种把所有的状态都放在服务器端的框架,简直就是在开“技术倒车”。

在REST+Ajax这样明显的发展趋势的大背景下,我认为,Seam不会有什么前途。


正是这样,jboss web server才好卖嘛.
而且gavin坚信session复制的效果很好

感觉晓钢的seam讲得太少,也较浅,不过可能因为用的人太少了吧.
俺有个项目正在用seam. 1.1的bug还不少...
0 请登录后投票
论坛首页 海阔天空版

跳转论坛:
Global site tag (gtag.js) - Google Analytics