关闭 使用Spring的HibernateDaoSupport时的getSession()3个方法的区别

转载 2016年08月29日 14:47:50

在继承了HibernateDaoSupport的Dao中,

 this.getsession实际上是调用了父类HibernateDaoSupport中的方法获得session。使用spring管理hibernate的SessionFactory的时候,这个方法会从session池中拿出一session。这样做有可能有问题,尽管这种方式拿到的Session会自动关闭,但是他是有一定的失效策略的,而且在超session池连接数的时候,spring无法自动的关闭这些session。  不推荐使用

          
 this.getHibernateTemplate().getSessionFactory().getCurrentSession()从spring管理的sessionFactory中创建一个绑定线程的session。Spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭。这样做可以避免手动的管理实务,同时一个线程最多开启和关闭一次session又可以提高程序的性能。 极力推荐使用这种方法 

    this.getHibernateTemplate().getSessionFactory().OpenSession。这种方法从spring管理的sessionFactory中创建一个session,此session不是线程绑定的。当执行完一个实务的时候自动关闭session。这种方法不用手动管理实务,但是同一个线程多次的开启和关闭session,浪费系统资源和影响执行效率,正常情况下还是不要用了。 

这个是测试的dao层 log是在servi层构造好的然后传入


package com.test.spring.dao;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.test.spring.model.Log;

public class LogDaoMysqlImpl extends HibernateDaoSupport implements LogDao  {
   
 public void addLog(Log log) {
 //this.getSession().save(log);
   //getHibernateTemplate().save(log);
    this.getHibernateTemplate().getSessionFactory().openSession().save(log);
     
 }

}


执行结果如下,log4j产生的日志被忽略

org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint: execution(addUser)
check security
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint: execution(addUser)
check security
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint: execution(addLog)
check security
org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint: execution(addLog)
check security
Hibernate: insert into log (type, time) values (?, ?)


没有进行session的关闭(不用spring也不用关闭session,session的关闭交给SessionFactory自动处理,但是使用spring的this.getSession没有使用spring创建SessionFactory而是直接从spring的session缓冲池拿到session,spring的session缓冲池中一般默认生成10session,前面也说了,可能是其他线程使用完没有关闭的,所以要显示的调用close,释放资源,因为取出来就放不回去了。所以要手动关闭,而且他两种获取的方法使用了spring提供的SessionFactory,spring会自动的处理没有必要进行手动关闭),就连事物的开启与关闭也不用。

这就是使用Spring的好处,把切面上零散的代码统一进行处理。

--------------------------------------------------------华丽的分割线--------------------------------------------------------------




1.getCurrentSession(); 
获得当前会话中的session,该session有容器自行维护管理,Spring可以代理事务。
2.this.getSession();
从当前的执行中获得或创建一个hibernate的session对象,自己关闭,释放连接资源。
3.openSession();
调用函数自行创建一个数据库的连接,并将其打开,在使用Spring操作非查询语句的请况下,Spring的事务对该session对象不起到事务管理的作用,所以该session对象应当由程序员自己关闭,释放连接资源。

在项目中使用到了Spring框架技术,就是说明,我们不想直接去获取,打开Session,开始一个事务,处理异常,提交一个事务,最后关闭一个Session,使用Spring后,这样的工作对我们来讲太过于繁琐,

我们自己只专注于业务,不想去作这些重复而繁琐的操作。我们把这些责任全部委托给了Spring的HibernateTemplate,然后使用声明式的配置来实现这样的功能。

如果我们通过类似getSession()这样的方法获得了Session,那就意味着我们放弃了上面所说的一切好处。


在Spring的框架中HibernateTemplate提供了相当多有用的辅助功能。我们想用它提供的辅助功能。但是HibernateTemplate包装了

Hibernate的代码,使用了它以后不能直接访问到Session了。

HibernateTemplate提供HibernateCallback,就是为了满足这种使用了HibernateTemplate的情况下,仍然需要直接访问Session的需求而来的。它提供了在HibernateTemplate里面直接访问Session的能力,程序员不必人为的管理session对象, 这个就是使用HibernateCallback的原因。


hibernate4 和 spring3 整合注意事项:HibernateDaoSupport没有了找到篇好文章,我之前遇到的问题都在这都能找到。其实出现这些问题的关键就是hibernate4和hib

Hibernate4的改动较大只有spring3.1以上版本能够支持,Spring3.1取消了HibernateTemplate,因为Hibernate4的事务管理已经很好了,不用Spring再扩展了...
  • bigtree_3721
  • bigtree_3721
  • 2016年03月07日 10:14
  • 2438

Hibernate——基于HibernateDaoSupport的三个分页控制方法

import java.sql.SQLException; import java.util.List; import org.hibernate.HibernateException; impor...
  • qw799265
  • qw799265
  • 2013年11月05日 14:57
  • 792

如何在DAO层既使用注解又使用HibernateDaoSupport

说明: 1.在使用spring的时候,如何你用注解来实例化XxxDao,就无法继承HibernateDaoSupport.. 2.使用xml配置的话,可以通过继承HibernateDaoSuppo...
  • sinat_18882775
  • sinat_18882775
  • 2016年05月05日 05:15
  • 3485

SSH之继承HibernateDaoSupport对数据库的操作和不继承HibernateDaoSupport对数据库的操作的方法

在使用ssh来开发项目的时候,我们都希望spring来管理事务,进而管理dao层,增加开发效率,有利于快速实现功能,少出现错误。        如果需要在dao层访问数据库,可以采用在dao层的类继承...
  • u014492098
  • u014492098
  • 2014年12月23日 22:50
  • 2193

spring初始化、销毁容器时指定执行的方法

关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 通过...
  • liuxiao723846
  • liuxiao723846
  • 2017年03月05日 23:04
  • 1597

JAVA框架——Spring Mvc与struts2区别

虽然说没有系统的学习过spring MVC框架, 但是工作这么长时间, 基本上在WEB层使用的都是Spring MVC, 自己觉得Struts2也是一个不错的WEB层框架, 这两种框架至今自己还未...
  • xuxiaoxie
  • xuxiaoxie
  • 2016年05月09日 21:04
  • 1193

关于HibernateDaoSupport getSession()不能释放资源的问题及解决方法

关于HibernateDaoSupport getSession()不能释放资源的问题及解决方法   1、使用手动释放资源: Session session = getSession(); /...
  • materigirl
  • materigirl
  • 2014年05月12日 14:09
  • 531

spring 容器启动和关闭执行某个动作 ApplicationContext

spring 容器启动和关闭执行某个动作 ApplicationContext
  • sz_zhangwen
  • sz_zhangwen
  • 2016年10月18日 16:40
  • 3984

Spring注入 @Autowired和setter方式区别原理

spring 的注入方式有:setter、constructor、静态工厂方法、实例工厂方法、注解@Autowired自动装配几种方式。 今天我们要了解的是:setter和@Autowired两种方...
  • wenluoxicheng
  • wenluoxicheng
  • 2017年06月22日 17:04
  • 1095

关于spring的@resource注解的字段注入和setter注入的区别

请问字段注入的时候 1 @resource private IUserDao userDao; //请问如果我这样写了之后,是不是不用写相对应的setter getter方法了? 2 private...
  • FYBH_2k
  • FYBH_2k
  • 2015年10月24日 20:11
  • 2684
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关闭 使用Spring的HibernateDaoSupport时的getSession()3个方法的区别
举报原因:
原因补充:

(最多只允许输入30个字)