关于Jdon的CloseSessionInViewFilter

08-03-25 cats_tiger
         

对Spring的OpenSessionInViewFilter导致性能问题早有耳闻,但是这个东东实在方便,所以一直沿用至今,幸好没有遇到性能方面的问题。

但是,老猫我一直对它谨慎提防。

先解释一下Spring的问题,在OpenSessionInViewFilter中,首先try块中打开了Session,然后doFilter执行请求,最后在finally中关闭Session。大体就是这样,这段代码影响阅读的障碍物挺多,什么isSingleSession,Deferred之类的,但基本流程就是这样的。Spring不管3721就打开Session,如果这个时候遇到一点问题,比如网速慢,那么就会导致长时间打开数据库连接,当然也就影响性能了。

CloseSessionInViewFilter稍有不同,它将打开Session的任务交给DAO,好像就是那个HibernateTemplate中调用SessionProvider的时候,然后,Filter中只是负责关闭Session。

使用这两个Filter有一个前提,尤其是OpenSessionInView,一定把UrlMapping设置为*.do或*.jsf之类的,要不,呵呵,一个gif请求都要打开Hibernate...

Banq老大,在这个前提下,我有一个问题。当一个请求到达后,大致的过程是这样的:Filter(Spring打开Session)->Struts->DAO(JDon打开Session)->渲染页面->Filter(关闭Session)。只要Application收到请求,从Filter到Struts/JSF再到Service/DAO应该是非常快的,此时是不是CloseSessionInViewFilter的优势就不明显了?

不管怎样,Banq老大的这个思路还是很让人佩服呀,呵呵。

         

banq
2008-03-25 17:39

多谢肯定,还是不是很明白你的意思。

在复杂系统情况下,使用OpenSessionInViewFilter打开Session可能不一定立即使用,这就会造成Session打开闲置,在一个访问量比较大的情况下,这个危险度非常高,特别是存在事务的情况下,更可能引起死锁,我在平时咨询中碰到很多这样莫名其妙的性能问题,我怀疑这里有一个性能陷阱;Jdon框架的CloseSessionInViewFilter就回避这个问题,能缩短一些打开时间,。

在简单系统下,这两个区别不大。

[该贴被banq于2008-03-25 17:41修改过]

cats_tiger
2008-03-25 21:11

>在简单系统下,这两个区别不大

这就是我的问题。我的意思是,如果Filters定义的顺序合理,URL-Mapping也合适的话,这两个的区别会更小。

[该贴被cats_tiger于2008-03-25 21:13修改过]

oojdon
2008-11-03 12:18

>>使用这两个Filter有一个前提,尤其是OpenSessionInView,一定把UrlMapping设置为*.do或*.jsf之类的,要不,呵呵,一个gif请求都要打开Hibernate...

如果我后端的业务层处理根本就和数据库无关,比如发邮件,OSIV还是会open sesion ,close session?

freeren
2008-11-04 11:31

>>如果我后端的业务层处理根本就和数据库无关,比如发邮件,OSIV还是会open sesion ,close session?

这样的话,这个的确是个问题!