再发贴,寻求ssh架构策略

Johnson_Hong 2009-02-24 12:42:26
加精
现在网上流传的很多ssh架构的系统,包括开源的一些应用系统,很多都用了openSessionInView模式,这样一来,整个编程过程将大大简化。session的生命周期在整个请求范围内有效。我们可以把dao查询出来的有延迟加载属性的对象传递到页面中去。
但是在页面输出内容多的情况下,filter会使用页面缓冲区,这时filter的执行时间就和用户的网速有关,因此openSessionInview有可能造成数据库连接不能及时释放的问题。

如果不使用openSessionInView,那么我们一般会配置service层的方法使用事务,也就是说我们要在service层将所有延迟加载的属性
都取出来,放到vo中去,这样我们就需要建一系列的vo对象。严格的说,我们要在service层实现vo和po的转换。

保存数据时
action :获取formbean,将formbean转换为vo,save(vo)
service: vo->po,dao.save(po) (service层的curd方法都需要用vo做参数?)

查询数据时
dao:getList()
servce:遍历list,将list的每一个po转换为vo,有时需要处理po中的明细属性
这样vo和po的转换将带来很多额外的工作。有时感觉很多余。

另外有人提出用formbean作为vo,但是formbean是struts的东西,这样vo就和struts耦合,感觉不合理,最重要的是formbean反应的是form提交时的属性,但是查询列表里的对象可能和他的属性并不一样,除非构造一个冗余的formbean来处理输入和输出。vo和form的关系

这些问题,期望有高人可以解答。
...全文
2137 79 打赏 收藏 转发到动态 举报
写回复
用AI写文章
79 条回复
切换为时间正序
请发表友善的回复…
发表回复
荒野大NM 2012-09-07
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]
引用 14 楼 java2000_net 的回复:
延迟加载是罪魁祸首,所谓“成也萧何,败也萧何”。

我有时发现查询速度很慢,检查才发现是我没有启用延迟加载,造成递归的数据都被加载进来了。

我如果加上了延迟加载,那么许多页面将无法使用,必须在程序里进行递归的延迟加载数据的读取。

这里面涉及到的策略太麻烦了。

对于关联少,层次低的,用着没问题,一旦层次太多了,我宁可放弃面向……
[/Quote]

那就不要做表关联了岂不是更好,关联起来如果没有懒加载读取时肯定会加载啊。
个人觉得懒加载很好,因为如果你不去读关联的一方的实体对象它不会对数据库操作的,而且如果用的时候查的话,那跟懒加载有什么区别,都是用的时候去读。
zhu6100441 2010-11-02
  • 打赏
  • 举报
回复
这不是有struts2吗,为什么要纠结到openSessionInView呢,难道一个框架就把人憋死了吗?那是不是任何一个程序员在完成一个框架的开发以后,在去学习另一个框架时,又要来此纠结一下。这样子要死多少脑细胞呢?我感觉既然有好的东西了,为什么还要用以前的?路过,我打酱油的。。。。
cosmostornado 2010-11-02
  • 打赏
  • 举报
回复
好贴!!顶起。。
cosmostornado 2010-11-02
  • 打赏
  • 举报
回复
不知道,随便说说:把Session的生命周期结束到过滤器中。。
wangzhuoyan 2010-09-16
  • 打赏
  • 举报
回复
struts2 可以解决你的问题,他的普通pojo类就可以处理
wst004 2010-09-14
  • 打赏
  • 举报
回复
这个题确实很困扰人,但这三种方法确实都可行的。
性能上我觉得相差应该不太大,只要做得好,
kangnixi 2009-10-01
  • 打赏
  • 举报
回复
留着以后慢慢看看
luojihaidao 2009-03-10
  • 打赏
  • 举报
回复
学习!
huyanlin 2009-03-10
  • 打赏
  • 举报
回复
"最重要的是formbean反应的是form提交时的属性,但是查询列表里的对象可能和他的属性并不一样,除非构造一个冗余的formbean来处理输入和输出。vo和form的关系 ",在表示方面试下AJAX,SESSEION等SPRING2.0的新特性也试下,不知道能否做到你的要求!
liuxia1219 2009-02-28
  • 打赏
  • 举报
回复
好帖,学习。up
pushregistration 2009-02-27
  • 打赏
  • 举报
回复
友情up
herowzz 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 61 楼 Johnson_Hong 的回复:]
如果session的生命周期在service层结束,我们用关联还能带来多少好处呢?
直接把那些id的属性都用String表示,然后各种关联的集合,对象都按需要去取应该也不会麻烦多少吧。
听过很多人说他们的系统里从来不用关联。
[/Quote]

既然你的系统对性能要求这么苛刻,换ibatis吧,hibernate不是万能的
taobao用ibatis不也用的挺好的吗
lhxdpx 2009-02-27
  • 打赏
  • 举报
回复
我也来学习学习!~~
BearKin 2009-02-27
  • 打赏
  • 举报
回复
偶基本上没见过谁用到了HIBERNATE的关联(偶素菜菜) 使用HIBERNATE之后我们更习惯 :“哦 原来数据可以这么查” 但是呢我们完全可以不用这种查询方式么 。。。
petehero 2009-02-26
  • 打赏
  • 举报
回复
struts根本用不着form来封装数据,直接request.getParameter多方便,干嘛给自己找麻烦。
new_bird_0001 2009-02-26
  • 打赏
  • 举报
回复
顶9楼,用struts2可使开发简化很多,在struts2中,可以将po和vo简化合为一个action的属性对象(也就是作为action的一个属性),view层和dao可直接通过这个对象联系起来,网页到po的数据类型转换及对象赋值则由struts2的拦截器完成,数据校验由校验器或action的校验方法完成,通过了数据校验的po可直接交由dao处理,至于加载策略的问题,应该是dao类考虑的问题,处于po中的数据,应该由dao保证是准确的。
Johnson_Hong 2009-02-26
  • 打赏
  • 举报
回复
其实主要问题还是出在延迟加载,
如果不用延迟加载,同时又设定了关联关系,那么很多时候会做不必要的关联查询
如果用了延迟加载,又不用openSessioninView,则必须在service层去将需要使用的延迟加载的属性都取一遍
yanbeifei168 2009-02-26
  • 打赏
  • 举报
回复
来学习了
豆虫 2009-02-26
  • 打赏
  • 举报
回复
学习了
herowzz 2009-02-26
  • 打赏
  • 举报
回复
opensessioninview就是为了解决延迟加载session关闭的问题,
将session的关闭一直延迟到表示层

如果想解决这个问题,LZ的方案虽然可行,但是会造成非常大的代码量和vo转换的耗费的时间
还有一种,就是尽量不用关系连接,不用延迟加载,不过这样也会造成性能问题

所以,没有一种方案是最优的
如果不是对网速要求非常苛刻,建议还是用opensessioninview的好
如果性能问题跟不上,那就不要用hibernate的好,换别的orm可能更好一点
归根结底,选合适的就好
加载更多回复(54)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧