能否从单个数据库连接中获得多个事务?
在Hibernate中,通常我们只有一个SessionFactory的实例,它在内部从连接池获取DB连接。当我们从SessionFactory获得新的Session时,它是内部获取新的连接池还是跨多个Session共享数据库连接?
Hibernate是一个ORM,它是一个介于SQL数据库和pojo之间的层。
连接池提供了一种存储和重用java.sql.Connection
实例的方法,以提高速度和健壮性。
hibernate Session
是一个围绕Connection
的包装器,它允许您在不直接编写SQL的情况下保存pojo。
因此,hibernate Session
是围绕Connection
的包装器。
Connections
被保存在连接池中。调用SessionFactory.openSession
时,hibernate首先从提供的连接池中获取Connection
。然后在Connection
周围创建一个Session
并返回它。
当Hibernate与连接池一起使用时,每当Session需要JDBC连接时,它都会从连接池中分配连接。
会话完成后,它的行为取决于ConnectionReleaseMode
。对于Hibernate 3.1,默认的ConnectionReleaseMode
是AFTER_TRANSACTION
(是ON_CLOSE),这意味着Session
在transaction
端(提交或回滚)释放连接回池。
SessionFactory没有获得DB连接。SessionFactory是线程安全的,加载hibernate.cfg.xml文件,线程可以并发地访问它,并请求会话和单个数据库编译映射的不可变缓存。在构建SessionFactory时,将映射所有实体类。
你可以从SessionFactory获得任意数量的Session实例。会话不是线程安全的。,您不能在线程之间共享会话。会话惰性获取数据库连接。beginTransaction()仅在有需要时才会导致给定会话的连接加载。