gpt4 book ai didi

hibernate - 使用 StatelessSession 进行批处理

转载 作者:行者123 更新时间:2023-12-03 14:24:39 25 4
gpt4 key购买 nike

来自 documentation

如果我们需要插入 1000 000 行/对象:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
if ( i % 20 == 0 ) { //20, same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}

tx.commit();
session.close();

为什么我们应该使用这种方法?与 StatelessSession 相比,它给我们带来了什么样的好处:
    StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.insert(customer);
}

tx.commit();
session.close();

我的意思是,这个(“替代”)最后一个例子不使用内存,不需要同步,清理缓存,那么这应该是这种情况的最佳实践吗?那为什么要使用前一个呢?

最佳答案

从您链接到的文档中:

In particular, a stateless session does not implement a first-level cache nor interact with any second-level or query cache. It does not implement transactional write-behind or automatic dirty checking. Operations performed using a stateless session never cascade to associated instances. Collections are ignored by a stateless session. Operations performed via a stateless session bypass Hibernate's event model and interceptors. Due to the lack of a first-level cache, Stateless sessions are vulnerable to data aliasing effects.



这些是一些重要的限制!

如果您正在创建的对象或您所做的修改是对单个对象的标量字段的简单更改,那么我认为与批处理正常 session 相比,无状态 session 没有缺点。然而,一旦你想做一些更复杂的事情——比如操作一个对象的集合值属性,或者另一个从第一个级联的对象——那么无状态 session 更多的是障碍而不是帮助。

更一般地说,如果批处理的普通 session 提供了足够好的性能,那么无状态 session 只是不必要的复杂性。它看起来有点像普通的 session ,但它有不同的 API 和不同的语义,这是一种会招致 bug 的东西。

当然,在某些情况下它是合适的工具,但我认为这些是异常(exception)而不是规则。

关于hibernate - 使用 StatelessSession 进行批处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14174271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com