`
ruijf
  • 浏览: 69667 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Hibernate3.x openSession()与getCurrentSession()得到的连接的区别

阅读更多

测试1:openSession在不开启事务的情况下执行操作

Session session= SessionFactoryUtil.openSession();

(1):session.get(UserInfo.class,14L); //执行成功,得到数据

(2):session.delete(new UserInfo(16L)); //执行成功 但数据库数据不变(符合逻辑)

session.close();

 

追溯了下源码发现:

在不开启事务的情况下,session得到数据库连接是在执行查询语句的时候从连接池中获得。

private PreparedStatement getPreparedStatement(
final Connection conn,
String sql,
boolean scrollable,
final boolean useGetGeneratedKeys,
final String[] namedGeneratedKeys,
final ScrollMode scrollMode,
final boolean callable) ;在调用这个方法时传入了从连接池中拿到的连接。

在执行完数据操作后调用

afterOperation(boolean success);

发现是非事务型的session直接调用

connectionManager.aggressiveRelease();

释放连接。

测试2:getCurrentSession()在不开启事务的情况下执行操作

Session session= SessionFactoryUtil.getCurrentSession();

(1):session.get(UserInfo.class,14L);//抛出异常get is not valid without active transaction

(2):session.delete(new UserInfo(16L));// 抛出异常get is not valid without active transaction

//session.close(); //线程绑定session会自动关闭

说明:线程绑定session必须开启事务,此时的session已经加载了拦截器,在执行数据操作时必须在活动的事务范围中。

测试3:openSession在开启事务的情况下执行操作

Session session= SessionFactoryUtil.openSession();

session.getTransaction().begin();

(1):session.get(UserInfo.class,14L); //执行成功,得到数据

(2):session.delete(new UserInfo(16L)); //执行成功

session.getTransaction().commit();

session.close(); //如若配置hibernate.transaction.auto_close_session=true可省去

分析:

(a):session.getTransaction().begin()-->Transaction result = getTransaction()

-->result.begin()-->jdbcContext.connection()

{

if ( owner.isClosed() ) {
throw new SessionException( "Session is closed" );
}

return connectionManager.getConnection();

}

见到connectionManager有点熟悉了吧,这就是管理数据库连接的连接池.

(b):session.getTransaction().commit()-->connectionManager.aggressiveRelease()释放连接。

此时的数据库连接是在准备开启事务的时获得,事务提交的时候释放连接。

测试4:getCurrentSession()在开启事务的情况下执行操作

Session session= SessionFactoryUtil.getCurrentSession();

session.getTransaction().begin();

(1):session.get(UserInfo.class,14L); //执行成功

(2):session.delete(new UserInfo(16L)); //执行成功

session.getTransaction().commit();

说明:线程绑定session已经加载了拦截器,提交的时候释放连接关闭session。

总结:

(1)openSession()得到得session可以在显式开启事务的环境中使用,也可以在不开启事务的环境中使用(进行查询);getCurrentSession()必须在显式开启事务环境中使用。

(2)openSession()是否显式开启事务决定了session得到连接的时机不同。不开启事务的情况下数据库连接是在创建Statement时获得。因此在配置二级缓存的情况get()对象时,如果二级缓存中有需要的对象时,不会占用数据库连接。相反开启事务的情况下,无论二级缓存中是否有对象,多会占用数据库连接。

(3)getCurrentSession()总会占用数据库连接。

以上是学习Hibernate时的一些想法,不知道写得对不对。请大家指正。

分享到:
评论

相关推荐

    SessionFactory.getCurrentSession与openSession的区别

    博文链接:https://shaqiang32.iteye.com/blog/201918

    struts2.3.x+spring3.1.x+hibernate3.6 demo

    关键问题有几个,第一个HibernateDaoSupport这个没有了,在使用hibernateTemplate的时候,报错误:java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session 很是悲...

    hibernate session.doc

    delete()方法用于从数据库中删除与Java对象对应的记录。如果传入的参数是持久化对象,Session就计划执行一个delete语句。如果传入的参数是游离对象,先使游离对象被Session关联,使它变为持久化对象,然后计划执行一...

    getCurrentSession 与 openSession() 的区别

    NULL 博文链接:https://bbxyhaihua.iteye.com/blog/505085

    mybatis3.x源码深度解析与最佳实践.pdf

    MyBatis 3.x源码深度解析与最佳实践 本资源提供了MyBatis 3.x的源码深度解析和最佳实践,涵盖了MyBatis的架构设计、源码实现、插件机制、缓存机制、事务机制等方面的知识点。通过本资源,您可以深入了解MyBatis的...

    Hibernate3使用经验

    ---------------Hibernate3.0 配置-------------- 1.Hibernate中配置参数 /** * 注意:HQL中使用参数的方法: * 1.根据参数名称来设置参数:匹配名称; * 2.根据参数位置来设置参数:匹配位置; */ //根据参数名称来...

    Spring4.0+Hibernate4.0+Struts2.3整合案例

    1、Spring 3.x 对 Hibernate 4.x 不提供 HibernateDaoSupport,所以在dao的实现层注入SessionFactory 2、报错:org.hibernate.HibernateException: No Session found for current thread 意思是必须在...

    三大框架原理

    Hibernate工作原理及为什么要用? 原理: 1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件 2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息 3.通过...

    J2EE利用Hibernate采用B/S架构网页设计

    sessionFactory.openSession() : null; threadLocal.set(session); } return session; } /** * Rebuild hibernate session factory * */ public static void rebuildSessionFactory() { try { ...

    hibernate操作数据库笔记

    //该方法将到classpath下解析hibernate.cfg.xml中的配置,如果不用Hibernate默认的配置文件名和路径,可在该方法中指定Hibernate配置文件的名称和路径 2.用Configuration对象获取SessionFactory和Session对象:...

    Hibernate1

    对 Hibernate 初体验 1.新建一个java工程,工程名为Hiberante1 2.导入相应的jar包 1)hibernate需要导入这些包 2)因为我们需要操作数据库所以要导入数据库的包,我用的mysql数据库 3.创建数据库以及表 ...

    castle.activerecord

    找这个资源的人都知道这是干什么的,就不多说什么了,

    Java常见面试题208道.docx

    123.在 hibernate 中 getCurrentSession 和 openSession 的区别是什么? 124.hibernate 实体类必须要有无参构造函数吗?为什么? 十三、Mybatis 125.mybatis 中 #{}和 ${}的区别是什么? 126.mybatis 有几种分页方式...

    SSH的jar包.rar

    SSH(struts+spring+hibernate)的jar包 SSH 通常指的是 Struts2 做前端控制器,Spring 管理各层的组件,Hibernate 负责持久化层。 一个请求在Struts2框架中的处理大概分为以下几个步骤: 1、客户端初始化一个指向...

    OA项目SSH整合框架

    一,集成 Spring 与 Hibernate 1,配置SessionFactory 1,配置 ---------------------- applicationContext.xml ------------------------ <!-- 配置SessionFactory(整合Hibernate) --> ...

    ACCP8.0北大青鸟SSH10章上机

    Configuration configuration = new ...或者通过MyEclipse的Hibernate工具自动生成的HibernateSessionFactory.getSession()方法来获取Session,调用HibernateSessionFactory. closeSession()方法来关闭session。

    SSH-Jsp期末考试简答题带答案

    2. Hibernate 中 openSession()和 getCurrentSession()的差别 Hibernate 是一个基于Java的持久层框架,它提供了对数据库的访问和操作能力。openSession()和getCurrentSession()是Hibernate中两个重要的Session创建...

    hibernate精华教程

    1)配置环境,加载hibernate的jar文件,以及连接数据库连接使用的jar文件,并配置CLASSPATH环境变量。 2)写POJO类(普通的java类) 3)写hibernate所需的配置文件,hibernate.cfg.xml ,Xxxxx.hbm.xml 4)调用...

Global site tag (gtag.js) - Google Analytics