这是一个过滤器,用于确保关闭session资源,也用于获得session资源:HibernateFilter.getSession()
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateFilter implements Filter {
private static ThreadLocal hibernaThreadLocal = new ThreadLocal();
private static SessionFactory factory;
public void destroy() {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
try {
//加载页面之前
filterChain.doFilter(servletRequest, servletResponse);
}finally {
//页面加载完hibernate使用的对象后关闭资源
Session session = (Session)hibernaThreadLocal.get();
if(session != null) {
if(session.isOpen()) {
session.close();
}
hibernaThreadLocal.remove();
}
}
}
public void init(FilterConfig filterConfig) throws ServletException {
try {
Configuration cfg = new Configuration().configure();
factory = cfg.buildSessionFactory();
}catch(Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
}
public static Session getSession() {
Session session = (Session)hibernaThreadLocal.get();
if(session == null) {
session = factory.openSession();
hibernaThreadLocal.set(session);
}
return session;
}
}
分享到:
相关推荐
综上所述,`OpenSessionInViewFilter`作为一种简化Hibernate Session管理和事务处理的方式,在适当的场景下能够极大地提高开发效率和代码质量。但在使用时也需要注意其潜在的性能影响和其他风险,合理选择是否启用该...
为了练手培训,给大家准备的 Open Session In View 的简单例子,纯代码,大家可以参考,其中主要说了六部分内容: 1.通过接口编程 2.通过spring注入dao到 action 3.通过 open session in view filter 支持 延迟加载...
2. **启用OpenSessionInView过滤器**:在web.xml中配置OpenSessionInViewFilter,该过滤器会在HTTP请求开始时开启一个新的Hibernate Session,并在请求结束时提交或回滚事务并关闭Session。 3. **编写业务逻辑**:在...
`Open Session In View`的主要作用是在Web请求的开始阶段打开`Hibernate session`,并在请求结束时自动关闭该session。这样做的好处在于,可以确保在整个请求处理过程中session始终处于可用状态,使得在视图(View)层...
1. **在关闭Session之前初始化关联对象**:在关闭Session前,可以显式调用`Hibernate.initialize()`方法来初始化关联对象,确保数据已经加载到内存中。 2. **使用OpenSessionInView模式**:这是一种常用的设计模式,...
《韩顺平Spring雇员管理系统中的Hibernate ORM框架详解》 ...这个压缩包中的"hibernate jar包"是实现这些功能的关键,它包含Hibernate运行所需的类和库,是开发者在项目中使用Hibernate不可或缺的部分。
- **OpenSessionInView**:是一种设计模式,用于Web应用中,通过过滤器在请求开始时打开`Session`,结束时关闭,确保整个请求过程中`Session`可用,从而支持延迟加载。但这种方法可能导致过多的数据库连接,因此也...
本方案主要探讨如何在基于Hibernate和Spring框架的环境中实现多数据库的管理,特别是在`OpenSessionInView`模式下的配置。 首先,我们看到在`applicationContext.xml`配置文件中定义了两个数据源,一个用于读操作...
4. **使用OpenSessionInView模式**:这是一种常用的做法,在Web请求开始时打开Session,在请求结束时关闭Session。这样可以在整个请求过程中安全地访问延迟加载的对象。 5. **自定义Session管理**:通过Spring管理...
在软件开发领域,特别是Java Web开发中,Struts、Spring 和 Hibernate 被广泛地应用于构建复杂的应用程序。这三大框架各有所长,分别在不同的层面发挥作用。为了更好地利用这些框架的优势,开发者通常会采用SSH...
- **OpenSessionInView** 是Hibernate的一个重要概念,它允许在视图层打开一个Session,这样就可以在渲染视图的时候访问数据库。 - **get() 和 set() 方法** 用于对象属性的获取和设置,在文档中被用于封装实体类...
OpenSessionInView(OSIV)模式是SSH整合中常见的一种优化策略,它在用户的一次HTTP请求过程中保持Hibernate Session,避免了多次打开和关闭Session,减少了N+1查询问题,提高了性能。 **Spring** 是一个全面的企业...
监听器方面,Hibernate提供了自定义监听器和配置监听器的功能,用于监控Hibernate的事件,如session的创建和关闭等。 总的来说,Hibernate学习笔记涵盖了从基础到高级的多个方面,对于希望掌握Hibernate的开发者来...
OpenSessionInView过滤器在Web请求的整个生命周期内保持一个Hibernate Session,使得在视图渲染阶段也能访问到数据库对象,避免了懒加载异常。 五、配置文件 1. `jdbc.properties`:存放数据库连接信息,如URL、...
在用户请求到达时开启一个数据库Session,在请求处理完后关闭Session。这样,整个请求生命周期内,数据库操作都可以在一个Session内完成,避免了可能出现的 LazyInitializationException。 在本项目中,SSH整合实现...
- `openSessionInView`模式是在Web层使用Filter打开和关闭Session,确保每个HTTP请求都有一个活跃的Session,以支持延迟加载。 6. Spring的事务管理: - 有两种方式:声明式事务(基于注解或XML配置)和编程式...
在Web开发中,OpenSessionInView模式能有效解决这个问题,但也要注意避免长时间占用Session资源。 其次,【抓取粒度】的调整也是关键。粒度决定了导航关联关系时预加载的数据量。通过设置batch-size,可以控制一次...
在基于Hibernate或其他ORM框架的Spring应用中,由于HTTP请求的无状态性,一次数据库操作可能跨多个方法调用,这就需要数据库会话(Session)在整个请求处理过程中保持打开状态。`OpenSessionInViewFilter`就是为了...