Hibernate下openSession和getCurrentSession获得的联接与事
摘要: 手机软件开发设计 Hibernate下openSession和getCurrentSession获得的联接与事务管理的关联 Hibernate下openSession和getCurrentSession获得的联接与事务管理的关联归类标识: Java 检测1:openSession不在打开...
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)
记牢我,下一次回应时无需再次键入本人信息内容