我提到了许多文章,但仍然不清楚session.clear
hibernate状态下的性能。
根据我到目前为止遇到的是,当我们使用批量保存/更新时,如下所示:
Session session = SessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Employee employee = new Employee(.....);
session.save(employee);
if( i % 50 == 0 ) { // Same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();
sesion.flush();
用于刷新会话强制Hibernate将Session的内存中状态与数据库同步。
题
1. 刷新会话后,为什么需要这样做session.clear()
?真的需要吗?
2. 会session.clear()
执行提交动作吗?
3. 如果session.clear()
逐出所有已加载的对象,则在执行提交和回滚操作时内部会发生什么?
可以将会话视为自开始当前事务以来已经从数据库加载(或持久存储到)的实体的缓存。
Session.clear
并非以任何方式强制执行,但是如果您在一个事务中执行大量实体加载/保存操作,则很有用,以避免出现内存不足错误。在您的示例中,您将employee
在会话中复制50个实体。如果没有flush
and clear
方法调用,则每50个对象中save()
您将有100.000个实体在会话中复制(并且不是垃圾回收的,因为会话具有指向该实体的链接)。
Session.clear
将不会执行提交或回滚。甚至都不是flush
(因此,为什么您应该在之前进行刷新Session.clear
,以便hibernate生成SQL查询来查询未决的实体更新。
回滚或提交操作不是在应用程序端执行的,而是在数据库中执行:hibernate只会要求数据库进行提交或回滚(Hibernate可能会在提交操作之前触发刷新,但刷新不属于提交的一部分)。提交操作将(也无法)访问会话。这是一种数据库内部机制,由于自事务开始以来运行了所有SQL查询,因此该数据库内部机制将保留(或还原)执行的数据修改。
完全以相同的方式,在hibernate状态下打开事务并没有执行很多操作:主要是从池中获取数据库连接,并告诉数据库 不要
auto_commit
遵循sql查询,而是等待提交或回滚命令。
我从网上和论坛上看到了关于BatchSize的相关主题,但我仍然不明白一些部分。所以让我们描述一下我理解的和不理解的。 批量取数:选择取数的优化策略。Hibernate通过指定主键或外键列表,在一次选择中检索一批实体实例或集合。 让我们有JPA 2.0,带有Hibernate实现。这些实体: } 因此,我懒得去了解产品中的制造商。因此,当我执行select fetching时,就完成了。所以我有很
我正在处理一些旧的应用程序代码,其中似乎涉及到几个概念,因此我希望能够将它们改进为一个坚实而严格的实践。 基本上,整个代码都用这样的HibernateSessionRequest estFilter包装 然后,有一个拦截器,做这样的事情 然后还有更多的业务逻辑代码,包括更多的初始事务和会话清除等。 那么,问题是: 当在同一会话中多次调用beginTransaction时会发生什么 非常感谢。
问题内容: 我正在使用带有Hibernate的MS SQL Server 2008。我的问题是Hibernate如何实现 采取以下简单方案。 如果我有一个返回100行的查询,并且如果我将1传递给,这会影响SQL Server本身返回的结果(就像运行一条语句一样),还是Hibernate首先获取所有结果(在这种情况下为所有100行)并挑选最高的自己? 我问的原因是,当行数开始增加时,它将出现巨大的性
问题内容: 我已经为EHCache配置了defaultCache(用于元素),StandardQueryCache(用于查询)和UpdateTimestampsCache(我认为是为了跟踪数据库更新……但我实际上并没有真正地了解它的功能)。 我已经为每个缓存设置了maxElementsInMemory,但是我没有得到的是这个数字控制StandardQueryCache和UpdateTimestam
本文向大家介绍hibernate 是如何工作的?相关面试题,主要包含被问及hibernate 是如何工作的?时的应答技巧和注意事项,需要的朋友参考一下 读取并解析配置文件。 读取并解析映射文件,创建 SessionFactory。 打开 Session。 创建事务。 进行持久化操作。 提交事务。 关闭 Session。 关闭 SessionFactory。
问题内容: 搜索了几个小时,但我陷入了使用JPA的PlayFramework学习的困境。我正在建立一个示例网站,可以在其中发布帖子。但是这些帖子可以具有以下状态: PostDraft(帖子是草稿,不发布) PostPublished(帖子可以发布) 这些状态存储在单独的表中。显然,州立草稿 尚不可见。 所以我有这些课: 页面类(从表中获取页面信息,一个页面可以有多个帖子) 帖子类(帖子可以在草稿中