首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > 谨慎使用OpenSessionInViewFilter
【标  题】:谨慎使用OpenSessionInViewFilter
【关键字】:OpenSessionInViewFilter
【来  源】:http://blog.csdn.net/hippoz/archive/2006/11/24/1412752.aspx

谨慎使用OpenSessionInViewFilter

用了OpenSessionInViewFilter之后,程序开发确实少了很多问题。一个直接的优点就是,不用再去关心lazy-loading的问题,因为在一个Request的处理周期内,Session都是Open的。

但是,"Great Charge means great responsibility",更大的方便也就意味着更大的责任。此Filter运用时也要非常小心。

从OpenSessionInViewFilter的文档中,我们可以看到下面一段话:


/*Quote */

WARNING: Applying this filter to existing logic can cause issues that
have not appeared before, through the use of a single Hibernate Session for the
processing of an entire request. In particular, the reassociation of persistent
objects with a Hibernate Session has to occur at the very beginning of request
processing, to avoid clashes with already loaded instances of the same objects.


Alternatively, turn this filter into deferred close mode, by specifying
"singleSession"="false"
: It will not use a single session per request then,
but rather let each data access operation or transaction use its own session
(like without Open Session in View). Each of those sessions will be registered
for deferred close, though, actually processed at request completion.

A single session per request allows for most efficient first-level caching,
but can cause side effects
, for example on saveOrUpdate or if continuing
after a rolled-back transaction
. The deferred close strategy is as safe as
no Open Session in View in that respect, while still allowing for lazy loading
in views (but not providing a first-level cache for the entire request).

Looks up the SessionFactory in Spring's root web application context.
Supports a "sessionFactoryBeanName" filter init-param in web.xml;
the default bean name is "sessionFactory". Looks up the SessionFactory on each
request, to avoid initialization order issues (when using ContextLoaderServlet,
the root application context will get initialized
after this filter).

NOTE: This filter will by default not flush the Hibernate Session,
as it assumes to be used in combination with service layer transactions that care
for the flushing, or HibernateAccessors with flushMode FLUSH_EAGER. If you want this
filter to flush after completed request processing, override closeSession
and invoke flush on the Session before closing it. Additionally, you will
also need to override getSession() to return a Session in a flush mode
other than the default FlushMode.NEVER. Note that getSession
and closeSession will just be invoked in single session mode!

在Hibernate的论坛里面,我也看到了类似的话,

// Quote


An alternative solution that you don't need to implement yourself is to use the Spring Franmework's OpenSessionInViewFilter class. You simply define a servlet filter mapping for the filter and it takes care of opening a Session when a request comes in and closing it when the response is generated.

In fact, it will even bind the Session to the current thread and Spring provides a static SessionFactoryUtils.getSession() method that intelligently returns the bound Session or a new one (optionally).

We use this pattern in our Struts application and it works like a charm. You can reliably get the one Session even if you use jsp:include and you can pass around your Hibernate POJOs without worrying about lazy initialization exceptions anywhere.

However, be aware that having a single Session open for an entire request/response cycle can result in some unexpected behavior that did not happen before. We encountered this ourselves, but dealt with it by using the JUnit setUp() and tearDown() methods to mimic the OpenSessionInViewFilter behavior in our unit tests and solving the quirks from there.


Single Session虽然可以最大限度的使用Session中的一级缓存,然而,却可能带来很多的副作用。我在项目中也碰到了这样的问题(saveOrUpdate之后的查询仍旧返回保存前的值)

/**Quote From Pro Hibernate 3*/


Caution The analogy between a Hibernate Session and a JDBC connection only goes so far. One important difference is that if a Hibernate Session throws an exception of any sort, you should discard it and obtain a new one. This prevents data in the session’s cache from becoming inconsistent with the database.


 
一些实用的正则表达式(匹配规则):【上一篇】
JSP中request.getParameterNames的应用:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 在TextBox中查找和继续查找
  • rhel4 acl
  • 控件数组的操作技巧
  • 一份oracle初学者的好资料
  • LCD驱动程序
  • 奇怪的返回:ask :ask
  • C++之奇技淫巧 from cpp@newsmth
  • linux下RTP编程
  • 如何避免Microsoft非标准JavaSDK的潜在危险(1)
  • 解析#pragma指令
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.