一 opensession与getCurrentSession的区别
1、 getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要手动关闭。如果使用openSession而没有手动关闭,多次之后会导致连接池溢出。
2、openSession每次创建新的session对象,getCurrentSession使用现有的session对象。
二 测试openSession每次创建新的session对象
1、测试代码
@Test
public void testOpenSession(){
// 创建配置对象
Configuration config = new Configuration().configure();
// 创建服务注册对象
ServiceRegistry serviceRegistery = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
// 创建会话工厂对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistery);
// 创建会话对象
Session session1 = sessionFactory.openSession();
Session session2 = sessionFactory.openSession();
System.out.println(session1==session2);
}
2、运行结果
false
三 测试getCurrentSession使用现有的session对象
1、测试代码
@Test
public void testGetCurrentSession(){
// 创建配置对象
Configuration config = new Configuration().configure();
// 创建服务注册对象
ServiceRegistry serviceRegistery = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
// 创建会话工厂对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistery);
// 创建会话对象
Session session1 = sessionFactory.getCurrentSession();
Session session2 = sessionFactory.getCurrentSession();
System.out.println(session1==session2);
}
2、运行结果
true
四 openSession用完后必须手动关闭,否则会溢出
1、测试代码
@Test
public void testSaveStudentswithOpenSession(){
// 创建配置对象
Configuration config = new Configuration().configure();
// 创建服务注册对象
ServiceRegistry serviceRegistery = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
// 创建会话工厂对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistery);
// 创建会话对象
Session session1 = sessionFactory.openSession();
// 开启事务
Transaction transaction = session1.beginTransaction();
Students s= new Students(1,"张三丰","男",new Date(),"武当山");
session1.doWork(new Work(){
@Override
public void execute(Connection connection) throws SQLException {
// TODO Auto-generated method stub
System.out.println("connection hashCode:"+connection.hashCode());
}
});
session1.save(s);
//session.close();
transaction.commit();
Session session2 = sessionFactory.openSession();
transaction = session2.beginTransaction();
s= new Students(2,"李四","男",new Date(),"武当山");
session2.doWork(new Work(){
@Override
public void execute(Connection connection) throws SQLException {
// TODO Auto-generated method stub
System.out.println("connection hashCode:"+connection.hashCode());
}
});
session2.save(s);
transaction.commit();
}
2、测试结果
connection hashCode:1048278180
Hibernate:
insert
into
STUDENTS
(SNAME, GENDER, BIRTHDAY, ADDRESS, SID)
values
(?, ?, ?, ?, ?)
connection hashCode:156943829
Hibernate:
insert
into
STUDENTS
(SNAME, GENDER, BIRTHDAY, ADDRESS, SID)
values
(?, ?, ?, ?, ?)
五 getCurrentSession不用关闭session
1、测试代码
@Test
public void testSaveStudentswithGetCurrentSession(){
// 创建配置对象
Configuration config = new Configuration().configure();
// 创建服务注册对象
ServiceRegistry serviceRegistery = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
// 创建会话工厂对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistery);
// 创建会话对象
Session session1 = sessionFactory.getCurrentSession();
// 开启事务
Transaction transaction = session1.beginTransaction();
Students s= new Students(1,"张三丰","男",new Date(),"武当山");
session1.doWork(new Work(){
@Override
public void execute(Connection connection) throws SQLException {
// TODO Auto-generated method stub
System.out.println("connection hashCode:"+connection.hashCode());
}
});
session1.save(s);
transaction.commit();
Session session2 = sessionFactory.getCurrentSession();
transaction = session2.beginTransaction();
s= new Students(2,"李四","男",new Date(),"武当山");
session2.doWork(new Work(){
@Override
public void execute(Connection connection) throws SQLException {
// TODO Auto-generated method stub
System.out.println("connection hashCode:"+connection.hashCode());
}
});
session2.save(s);
transaction.commit();
}
2、运行结果
connection hashCode:455886737
Hibernate:
insert
into
STUDENTS
(SNAME, GENDER, BIRTHDAY, ADDRESS, SID)
values
(?, ?, ?, ?, ?)
connection hashCode:455886737
Hibernate:
insert
into
STUDENTS
(SNAME, GENDER, BIRTHDAY, ADDRESS, SID)
values
(?, ?, ?, ?, ?)
相关推荐
### HIbernate Session 详解 #### 一、Session在Hibernate中的地位及作用 在Hibernate框架中,`Session` 是一个非常核心且重要的组件。作为Hibernate提供的主要操作数据库的接口,`Session` 不仅承担着保存、更新...
### Hibernate Session 详解:值得珍藏的深度解析 在Java持久化领域,Hibernate无疑占据了举足轻重的地位,而`Hibernate Session`则是其中的核心组件之一,它提供了与数据库交互的主要接口,是对象/关系映射(ORM)...
hibernate中session对象的状态详解
1. **缓存机制**:Hibernate支持一级缓存(Session级)和二级缓存(SessionFactory级),可以显著提升性能。 2. **批处理**:批量插入、更新和删除数据,减少数据库交互次数。 3. **延迟加载(Lazy Loading)**:只...
【hibernate与Session详解】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。通过Hibernate,我们可以将数据库中的表与Java类进行映射,从而实现对...
**Hibernate详解** Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使得开发者无需关注SQL的编写,可以更加专注于业务逻辑。本文将深入探讨Hibernate的核心概念、主要功能以及如何在...
Hibernate 配置文件详解 Hibernate 是一个流行的 ORM(Object-Relational Mapping)框架,用于简化 Java 应用程序中的数据库交互。 Hibernate 的配置文件是其核心组件之一,用于定义 Hibernate 的运行期参数。下面...
**Hibernate缓存深入详解** 在Java企业级应用开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着应用规模的扩大,数据访问性能成为了一个不可忽视的问题。这时,...
【Hibernate缓存深入详解】 在Java的持久化框架Hibernate中,缓存机制是提升系统性能的关键因素。它位于Hibernate应用和数据库之间,减少了对数据库的直接访问,从而提高了应用程序的运行速度。缓存中存储的是...
标题"hibernate--5.Hibernate配置文件详解-2"暗示我们将继续上一节的内容,进一步深入理解Hibernate配置文件的各个方面。通常,Hibernate的配置文件以`hibernate.cfg.xml`的形式存在,它是项目初始化和连接数据库的...
标题"hibernate--5.Hibernate配置文件详解"暗示我们将探讨的是Hibernate 5版本的配置细节。这个版本引入了一些新特性和改进,同时也保持了对前一版本的兼容性。配置文件是Hibernate的核心部分,它定义了与数据库的...
12.2.3 Session(提供Connection) 12.3 使用Hibernate操作数据库的示例 12.3.1 创建数据库表 12.3.2 编写表对应的JavaBean 12.3.3 编写JavaBean对应的Xml 12.3.4 编写Hibernate的配置文件 12.3.5 编写并验证测试...
### Hibernate技术详解 #### 一、Hibernate简介与特点 Hibernate是一种开源的对象关系映射(ORM)框架,用于Java持久化应用程序。它通过提供强大的映射工具和服务,将面向对象的数据模型映射到基于SQL的关系数据库...
**Hibernate缓存详解** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。为了提高数据访问性能,Hibernate引入了缓存机制,它可以减少对数据库的直接访问,从而提升应用的...
通过SessionFactory,我们可以创建Session对象,进而进行数据库操作。 7. **配置数据源**: 配置数据源信息,包括数据库连接池,这通常是通过Spring的DataSource bean来实现的。这样,Spring可以根据配置信息自动...
### Hibernate 参数配置详解 #### 一、概述 Hibernate 是一款流行的 Java 持久层框架,它通过提供一套丰富的 API 和配置选项来简化数据库访问。本文档将深入探讨 Hibernate 的核心配置参数及其功能,帮助开发者更...
在这个“hibernate 实践 - Query详解”的主题中,我们将深入理解如何使用Query接口来执行SQL查询,并绑定参数。 1. **Query接口** Query接口是Hibernate提供的一种用于执行HQL(Hibernate查询语言)或SQL查询的API...
《Hibernate中文开发详解》是针对Hibernate框架的一份详尽指南,旨在帮助开发者深入了解并掌握这一持久化技术。本文将基于给定的标题、描述、标签和部分内容,深度解析Hibernate的关键概念与开发技巧。 ### ...