[转]OpenSessionInView模式
* hibernate事物边界问题
* 因session关闭导致hibernate延迟加载例外的问题
事物边界:
一个事物的完成应该是在业务层完成的,但是事物的创建却是在数据层来做,这样必定造成业务层和数据层耦合性增强。
延迟加载例外:
如你所知,延迟加载使用了动态代理机制,只有在真正使用这个对象的时候才会去访问数据库,但是如果在数据层进行了事物提交,session关闭,再去访问
数据就会导致延迟加载例外异常,所以我们必须加大session的生命周期,在访问数据之后关闭session。
因此我们可以通过OpenSessionInView模式来解决上面的问题
OpenSessionInView模式需要用到一个非常重要的一个类:ThreadLocal
OpenSessionInView模式:
* 需要构建一个过滤器,把事物的创建及提交放在过滤器里进行。
* 加大session的有效范围,把session放在当前线程里(ThreadLocal),使session在当前线程内有效,并且在当前线程内访问的是同一个session。
OpenSessionInView模式缺点:
*并发性减弱
*内存消耗加大
1.实体类:
- package com.yx.zzg.pojo;
- import java.util.Date;
- public class User {
- private String id;
- private String username;
- private String password;
- private Date createTime;
- private Date endTime;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public Date getCreateTime() {
- return createTime;
- }
- public void setCreateTime(Date createTime) {
- this.createTime = createTime;
- }
- public Date getEndTime() {
- return endTime;
- }
- public void setEndTime(Date endTime) {
- this.endTime = endTime;
- }
- }
2.映射文件:
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping package="com.yx.zzg.pojo">
- <class name="User" table="t_user">
- <id name="id">
- <!-- 指定主键生成策略 -->
- <generator class="uuid" />
- </id>
- <property name="username" unique-key="true" />
- <property name="password" />
- <property name="createTime" />
- <property name="endTime" />
- </class>
- </hibernate-mapping>
3.提供一个过滤器:
- package com.yx.zzg.servelt;
- 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.Transaction;
- import com.yx.zzg.util.HibernateUtil;
- public class OpenSessionInView implements Filter {
- public void destroy() {
- }
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain filter) throws IOException, ServletException {
- Transaction tx = null;
- Session session = null;
- try {
- session = HibernateUtil.getThreadLocalSession();
- tx = session.beginTransaction();
- filter.doFilter(request, response);
- tx.commit();
- } catch (Exception e) {
- if (tx != null) {
- tx.rollback();
- throw new RuntimeException(e.getMessage(),e);
- }
- } finally {
- HibernateUtil.colseSession();
- }
- }
- public void init(FilterConfig arg0) throws ServletException {
- }
- }
4.web.xml中配置过滤器
- <filter>
- <filter-name>OpenSessionInView</filter-name>
- <filter-class>com.yx.zzg.servelt.OpenSessionInView</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>OpenSessionInView</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
5.HibernateUtil类:
- package com.yx.zzg.util;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- public class HibernateUtil {
- private static SessionFactory sessionFactory;
- //创建一个ThreadLocal对象
- private static ThreadLocal threadSession = new ThreadLocal();
- private HibernateUtil() {
- }
- static {
- Configuration cfg = new Configuration().configure();
- sessionFactory = cfg.buildSessionFactory();
- }
- /**
- * 从当前线程中获取session,如果没有,则得到session,并将此session放入当前线程中
- * @return
- */
- public static Session getThreadLocalSession() {
- Session session = (Session) threadSession.get();
- if (session == null) {
- session = getSession();
- threadSession.set(session);
- }
- return session;
- }
- /**
- * 关闭session,并将当前线程中的session设置为null
- */
- public static void colseSession() {
- Session session = (Session) threadSession.get();
- if (session != null) {
- session.close();
- threadSession.set(null);
- }
- }
- public static Session getSession() {
- return sessionFactory.openSession();
- }
- }
6.数据层方法:
- public User findUserById(String id) {
- User user = (User) HibernateUtil.getThreadLocalSession().load(
- User.class, id);
- return user;
- }
[转]OpenSessionInView模式的更多相关文章
- OpenSessionInView模式
首先搭建建构 引入jar包 创建实体类 Emp.java public class Emp { private Integer empId;//员工ID private String empname ...
- SSH第一篇【整合SSH步骤、OpenSessionInView】
前言 到目前为止,Struts2.Hibernate.Spring框架都过了一遍了.也写过了Spring怎么与Struts2整合,Spring与Hibernate整合-本博文主要讲解SSH的整合 整合 ...
- 【转】Hibernate 常见异常
转载地址:http://smartan.iteye.com/blog/1542137 Hibernate 常见异常net.sf.hibernate.MappingException 当出 ...
- Struts2,Spring, Hibernate三大框架SSH的整合步骤
整合步骤 创建web工程 引入相应的jar包 整合spring和hibernate框架 编写实体类pojo和hbm.xml文件 编写bean-base.xml文件 <!-- 1) 连接池实例 - ...
- hibernate中load和get方法的区别
1.读取时机不同(当lazy=true的时候) load是采用延迟机制(load语句不读库,等使用非主键时才去读库),而get不采用延 迟机制(get语句时马上读库): 2.搜索不到数据时的情 ...
- struts2支持的结果类型
在struts2-core.jar/struts-default.xml中,我们可以找到关于result-type的一些配置信息,从中可以看出struts2组件默认为我们提供了这 些result-ty ...
- Spring 管理数据源
Spring 管理数据源 不管通过何种持久化技术,都必须通过数据连接访问数据库,在Spring中,数据连接是通过数据源获得的.在以往的应用中,数据源一般是Web应用服务器提供的.在Spring中,你不 ...
- Hibernate 常见异常
Hibernate 常见异常net.sf.hibernate.MappingException 当出现net.sf.hibernate.MappingException: Error r ...
- OpenSessionInViewFilter 的配置及替代方案(转)
鸣谢:http://justsee.iteye.com/blog/1174999,http://blog.csdn.net/sunsea08/article/details/4545186 Sprin ...
随机推荐
- GBK UTF-16 UTF-8 编码表
GBK UTF-16 UTF-8 ================== D2BB 4E00 E4 B8 80 一 B6A1 4E01 E4 B8 81 丁 C6DF 4E03 E4 ...
- Python3 PyPAML 模块(配置文件的操作)
YAML 是专门用来写配置文件的语言,非常简洁和强大 它的基本语法规则如下: 1.大小写敏感 2.使用缩进表示层级关系 3.缩进时不允许使用Tab键,只允许使用空格. 4.缩进的空格数目不重要,只要相 ...
- ERROR: do not initialise statics to false
Question about git commit rule I git commit a patch, The patch has a "static int xxxxxxxxxxxxxx ...
- 【bzoj4896】补退选
傻逼题. 每个点维护下vector,然后随便做. #include<bits/stdc++.h> ; using namespace std; typedef long long ll; ...
- BZOJ 2460: [BeiJing2011]元素 贪心,线性基
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2460 解法:从大到小排序,依次贪心的添加到当前集合就可以了,需要动态维护线性基.用拟阵证明 ...
- 网站服务器压力Web性能测试(1):Apache Bench:Apache自带服务器压力测试工具
一个网站或者博客到底能够承受多大的用户访问量经常是我们在用VPS或者独立服务器搭建网站了最关心的问题,还有不少人喜欢对LNMP或者LAMP进行一些优化以便提高Web性能,而优化后到底有多大的效果,就需 ...
- Network Embedding
网络表示 网络表示学习(DeepWalk,LINE,node2vec,SDNE) https://blog.csdn.net/u013527419/article/details/76017528 网 ...
- redis使用教程
一.redis 的安装 官方就是个坑:只说make一下即可用,确实可以用,我以为装好了,结果好多问题: 安装步骤:make => make test => make install 1 ...
- 如何实现artTemplate模板的可重用性,以此框架打造自己的自定义组件
问题的提出: 我们为什么非得要引入artTemplate来进行JSON数据的渲染呢? http://dagmom.iteye.com/blog/1671498http://bbs.csdn.net/t ...
- mysql数据库设置远程连接权限
原文 问题现象 mysql 安装完毕,本机登录正常,在远程输入正确账号密码登录连接时报错如下 问题原因 远程IP没有登录权限,root用户默认只能在localhost也就是只能在本机登录,需要设置允许 ...