Hibernate下openSession和getCurrentSession获得的联接与事

摘要: 手机软件开发设计 Hibernate下openSession和getCurrentSession获得的联接与事务管理的关联 Hibernate下openSession和getCurrentSession获得的联接与事务管理的关联归类标识: Java 检测1:openSession不在打开...

手机软件开发设计 Hibernate下openSession和getCurrentSession获得的联接与事务管理的关联
Hibernate下openSession和getCurrentSession获得的联接与事务管理的关联 归类标识: Java 

检测1:openSession不在打开事务管理的状况下实行实际操作

Session session= SessionFactoryUtil.openSession();

(1):session.get(UserInfo.class,14L);  //实行取得成功,获得数据信息

(2):session.delete(new UserInfo(16L));  //实行取得成功 但数据信息库数据信息不会改变(合乎逻辑性)

session.close();

追朔了下源代码发觉:

不在打开事务管理的状况下,session获得数据信息库联接是在实行查寻句子的情况下从联接池中得到。

Java编码 private PreparedStatement getPreparedStatement(   final Connection conn,   String sql,   boolean scrollable,   final boolean useGetGeneratedKeys,   final String[] namedGeneratedKeys,   final ScrollMode scrollMode,   final boolean callable) 

      在启用这一方式时传到了从联接池中取得的联接。

在实行完数据信息实际操作后启用

afterOperation(ess);

发觉是是非非事务管理型的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()都会占有数据信息库联接。


网页链接(选填)

认证(*)

文章正文(*)(留言板留言最多篇幅:1000)

记牢我,下一次回应时无需再次键入本人信息内容



联系我们

全国服务热线:4000-399-000 公司邮箱:343111187@qq.com

  工作日 9:00-18:00

关注我们

官网公众号

官网公众号

Copyright?2020 广州凡科互联网科技股份有限公司 版权所有 粤ICP备10235580号 客服热线 18720358503

技术支持:公众号抽奖