Hibernate延迟加载Session关闭的解决方案
来源:互联网 发布:dnf自动存装备源码 编辑:程序博客网 时间:2024/05/21 00:17
Hibernate的强大之处之一是延迟加载功能,可以有效的降低数据库访问次数和内存使用量。但用的不好就会出现org.hibernate.LazyInitializationException。
这个异常出现的原因很简单,主要时在加载懒数据时Session已经关闭造成的,如下图:
那么OK,我们来考虑怎么解决吧。
我们只要在渲染JSP之前不要关闭Session,而在JSP渲染之后再关闭就OK啊。我们知道,在JSP/Servlet中,可以配置过滤器来实现这种功能。
我们考虑两种情况的解决方案: 单使用Hibernate和用Spring来管理Hibernate。
1. 单使用Hibernate:
我们可以自己写一个过滤器:
Java代码
public class HibernateThreadFilter implements Filter {
private SessionFactory sf=null;
public void init(FilterConfig arg0) throws ServletException {
sf=HibernateUtil.getSessionFactory();
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
sf.getCurrentSession().beginTransaction();
chain.doFilter(request, response);
sf.getCurrentSession().getTransaction().commit();
} catch (StaleObjectStateException staleEx) {
throw staleEx;
} catch (Throwable ex) {
ex.printStackTrace();
try {
//如果发生异常,让事务回滚。
if (sf.getCurrentSession().getTransaction().isActive()) {
sf.getCurrentSession().getTransaction().rollback();
}
} catch (Throwable rbEx) {
System.err.println(rbEx.toString());
}
}
}
public void destroy(){}
}
在web.xml中加入这个Filter的配置:
Xml代码
<filter>
<filter-name>HibernateThreadFilter</filter-name>
<filter-class>org.sunxin.struts2.filter.HibernateThreadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HibernateThreadFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这样就在访问后台代码之前打开session,访问后台代码之后关闭session。
2. 用Spring管理Hibernate:
Spring为我们提供了这样一个过滤器,我们这样配置一下就OK。
在web.xml中加入Filter的配置:
Xml代码
<filter>
<description>处理Hibernate的延迟加载问题</description>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<description> 默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其它名字的SessionFactory,则应该在这里指定这个名字。
我们可以自己写一个过滤器:
Java代码
public class HibernateThreadFilter implements Filter {
private SessionFactory sf=null;
public void init(FilterConfig arg0) throws ServletException {
sf=HibernateUtil.getSessionFactory();
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
sf.getCurrentSession().beginTransaction();
chain.doFilter(request, response);
sf.getCurrentSession().getTransaction().commit();
} catch (StaleObjectStateException staleEx) {
throw staleEx;
} catch (Throwable ex) {
ex.printStackTrace();
try {
//如果发生异常,让事务回滚。
if (sf.getCurrentSession().getTransaction().isActive()) {
sf.getCurrentSession().getTransaction().rollback();
}
} catch (Throwable rbEx) {
System.err.println(rbEx.toString());
}
}
}
public void destroy(){}
}
在web.xml中加入这个Filter的配置:
Xml代码
<filter>
<filter-name>HibernateThreadFilter</filter-name>
<filter-class>org.sunxin.struts2.filter.HibernateThreadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HibernateThreadFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这样就在访问后台代码之前打开session,访问后台代码之后关闭session。
2. 用Spring管理Hibernate:
Spring为我们提供了这样一个过滤器,我们这样配置一下就OK。
在web.xml中加入Filter的配置:
Xml代码
<filter>
<description>处理Hibernate的延迟加载问题</description>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<description> 默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其它名字的SessionFactory,则应该在这里指定这个名字。
</description>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
<init-param>
<description></description>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
- Hibernate延迟加载Session关闭的解决方案
- hibernate的延迟加载及其与session关闭的矛盾
- hibernate延迟加载和session关闭问题
- 如何理解 Hibernate的延迟加载机制?延迟加载与Session关闭的矛盾如何处理?
- 解决spring hibernate,session延迟加载的配置文件
- 使用Hibernate.initialize解决no session的延迟加载问题
- 使用Hibernate.initialize解决no session的延迟加载问题
- hibernate的延迟加载
- Hibernate的延迟加载
- hibernate 的延迟加载
- hibernate的延迟加载
- hibernate的延迟加载
- Hibernate 的延迟加载
- Hibernate的延迟加载
- Hibernate的延迟加载
- Hibernate 的延迟加载
- Hibernate的延迟加载
- Hibernate的延迟加载
- eclipse配合opencv的设置
- 【C】单词统计
- 类的接口和抽象类
- XML第十七讲:根据Schema生成XML文档
- Fence Repair
- Hibernate延迟加载Session关闭的解决方案
- Windows环境下Android NDK环境搭建
- 《COM技术内幕》图摘
- test
- 一种排序
- 搭建一个后台服务器--服务端(阻塞)
- iis清除缓存
- ODE45和ODE15S解法的区别
- [android]activity中每个方法用处