该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间: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之后也可以支持集群了。 |
|
返回顶楼 | |
发表时间:2007-04-19
robbin 写道 Gavin的演讲当中也不忘抨击了两句springframework,当然问题也说到了点子上,spring不使用OpenSessionInView的时候,确实处理lazy集合初始化在session关闭以后的问题很棘手。Gavin说EJB3没有这个问题,这引起我想试试EJB3的兴趣。
这算spring的问题么? |
|
返回顶楼 | |
发表时间: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条查询,不知道为什么。 |
|
返回顶楼 | |
发表时间:2007-04-19
引用 eager-fetch 我这边根本实现不了,在many-to-one端 配不配fetch="join"
视情况而定啦。建议开新贴讨论这个问题。我理解的eager-fetch保证的是not lazy(这一定必须保证).而join是一种期望的抓取策略,并不一定能保证。 |
|
返回顶楼 | |
发表时间:2007-04-20
daquan198163 写道 robbin 写道 Gavin的演讲当中也不忘抨击了两句springframework,当然问题也说到了点子上,spring不使用OpenSessionInView的时候,确实处理lazy集合初始化在session关闭以后的问题很棘手。Gavin说EJB3没有这个问题,这引起我想试试EJB3的兴趣。
这算spring的问题么? lazy 的问题很早就有人抱怨说是 hibernate 的设计缺陷, 不得已才使用 OpenSessionInView, 跟 spring 应该没啥关系. EJB3 可以做到 session 关闭后的 lazy? 莫非他能未卜先知加载 ui 上的元素, 还是根本不区分, 一股脑的加载到内存里? |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2007-04-20
现场感觉真的太棒了,难以想像J2EE社区教父level的人物这么和蔼。
不过~~ 我比较郁闷的是,居然跟另外一位同学重名了~~ 谁让我自己没有名片,去的时候满世界找,最后拿了同学的名片就去了 跟Gavin King亲笔签名的书失之交臂啊~~ 赶紧china-pub订购 |
|
返回顶楼 | |
发表时间: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级缓存也是非常好用的 |
|
返回顶楼 | |
发表时间:2007-04-20
庄表伟 写道 我在和dlee聊这个Seam框架,我们都相信,这种把所有的状态都放在服务器端的框架,简直就是在开“技术倒车”。
在REST+Ajax这样明显的发展趋势的大背景下,我认为,Seam不会有什么前途。 正是这样,jboss web server才好卖嘛. 而且gavin坚信session复制的效果很好 感觉晓钢的seam讲得太少,也较浅,不过可能因为用的人太少了吧. 俺有个项目正在用seam. 1.1的bug还不少... |
|
返回顶楼 | |