hibernate 批量处理数据
批量处理数据是指在一个事务中处理大量数据.
在应用层进行批量操作, 主要有以下方式:
- 通过 Session
- 通过 HQL
- 通过 StatelessSession
- 通过 JDBC API(只要会用这种,其他作为了解)
- 需要在 Hibernate 配置文件中设置 JDBC 单次批量处理的数目, 应保证每次向数据库发送的批量的 SQL 语句数目与 batch_size 属性一致
- 若对象采用 “identity” 标识符生成器, 则 Hibernate 无法在 JDBC 层进行批量插入操作
- 进行批量操作时, 建议关闭 Hibernate 的二级缓存
- 批量更新: 在进行批量更新时, 如果一下子把所有对象都加载到 Session 缓存, 然后在缓存中一一更新, 显然是不可取的
org.hibernate.ScrollableResults 对象由 Query 的 scroll 方法返回
通过StatelessSession来进行批量操作
- StatelessSession没有缓存,通过StatelessSession来加载、保存或更新后的对象处于游离状态。
- StatelessSession不会与Hibernate的第二级缓存交互。
- 当调用StatelessSession的save()、update()或delete()方法时,这些方法会立即执行相应的SQL语句,而不会仅计划执行一条SQL语句
- StatelessSession不会进行脏检查,因此修改了Customer对象属性后,还需要调用StatelessSession的update()方法来更新数据库中数据。
- StatelessSession不会对关联的对象进行任何级联操作。
- 通过同一个StatelessSession对象两次加载OID为1的Customer对象,得到的两个对象内存地址不同。
- StatelessSession所做的操作可以被Interceptor拦截器捕获到,但是会被Hibernate的事件处理系统忽略掉。
public class HibernateTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void init(){ Configuration configuration = new Configuration().configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()) .buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); session = sessionFactory.openSession(); transaction = session.beginTransaction(); } @After public void destroy(){ transaction.commit(); session.close(); sessionFactory.close(); } @Test public void testBatch(){ session.doWork(new Work() { @Override public void execute(Connection connection) throws SQLException { //通过 JDBC 原生的 API 进行操作, 效率最高, 速度最快! } }); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。