可以将会话视为自开始当前事务以来已经从数据库加载(或持久存储到)的实体的缓存。
Session.clear
并非以任何方式强制执行,但是如果您在一个事务中执行大量实体加载/保存 *** 作,则很有用,以避免出现内存不足错误。在您的示例中,您将employee
在会话中复制50个实体。如果没有flush
andclear
方法调用,则每50个对象中save()
您将有100.000个实体在会话中复制(并且不是垃圾回收的,因为会话具有指向该实体的链接)。Session.clear
将不会执行提交或回滚。甚至都不是flush
(因此,为什么您应该在之前进行刷新Session.clear
,以便hibernate生成SQL查询来查询未决的实体更新。回滚或提交 *** 作不是在应用程序端执行的,而是在数据库中执行:hibernate只会要求数据库进行提交或回滚(Hibernate可能会在提交 *** 作之前触发刷新,但刷新不属于提交的一部分)。提交 *** 作将(也无法)访问会话。这是一种数据库内部机制,由于自事务开始以来运行了所有SQL查询,因此该数据库内部机制将保留(或还原)执行的数据修改。
完全以相同的方式,在hibernate状态下打开事务并没有执行很多 *** 作:主要是从池中获取数据库连接,并告诉数据库 不要
auto_commit遵循sql查询,而是等待提交或回滚命令。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)