Hibernate批处理实战

我们在用数据库时,如果可以批量插入或者更新数据,可以很大地提高使用数据库的性能。但是我在用Hibernate实现批处理的过程中,走了一些弯路。下面我就把我的整个配置过程和经验总结分享,希望可以帮助到后来人。

撰写代码

首先你必须要撰写或者修改你的批处理代码。比如你的目标是通过Hibernate一次保存50个Customer对象,那你必须每save满50个对象,就flush一次,如下:

Transaction tx = session.beginTransaction();

for(Customer customer : customers) {
  session.save(customer );

  if(++i % 50 == 0) {
    session.flush();
    session.clear();
  }
}
tx.commit();

这是因为Hibernate会把新插入的数据都保存在缓存(persistence context cache)中。因为缓存大小的限制,所以隔一定数量就要flush,否则可能会碰上OutMemorException.

修改配置文件

Hibernate官方指导文档建议,为了最好的性能,应该把hibernate.jdbc.batch_size设置成和代码中procedure batch一样的size,在hibernate.cfg.xml中加上:

<property name="hibernate.jdbc.batch_size">50</property>

这里还有一点要注意的是,记得关掉batch操作的二级缓存。否则的话,每个对象被保存时,都会同时保存到二级缓存,这是一个不必要的浪费。

修改标识符生成器(id generator)

上面两个步骤看起来应该大功告成了,其实离成功还得远。首

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开启 Hibernate 5 的批处理需要两个配置:hibernate.jdbc.batch_size 和 hibernate.order_inserts。hibernate.jdbc.batch_size 表示批处理大小,hibernate.order_inserts 表示是否按照实体类的顺序插入数据。其操作步骤如下: 1. 在 Hibernate 配置文件中添加 hibernate.jdbc.batch_size 和 hibernate.order_inserts 配置; 2. 创建 Session 对象; 3. 开启事务; 4. 循环将多个对象添加到 Session 中; 5. 提交事务; 6. 关闭 Session。 下面是一个示例代码,假设要将多个用户信息批量插入到数据库中: ```java Session session = null; Transaction tx = null; try { // 添加 hibernate.jdbc.batch_size 和 hibernate.order_inserts 配置 Properties prop = new Properties(); prop.setProperty("hibernate.jdbc.batch_size", "50"); prop.setProperty("hibernate.order_inserts", "true"); sessionFactory = new Configuration().configure().addProperties(prop).buildSessionFactory(); // 创建 Session 对象 session = sessionFactory.openSession(); // 开启事务 tx = session.beginTransaction(); // 循环将多个对象添加到 Session 中 for (User user : users) { session.save(user); } // 提交事务 tx.commit(); } catch (Exception e) { // 回滚事务 if (tx != null) { tx.rollback(); } e.printStackTrace(); } finally { // 关闭 Session if (session != null) { session.close(); } } ``` 其中,users 是一个 User 对象的集合,表示多个用户信息。在添加完所有对象后,直接提交事务即可,Hibernate 会自动开启批处理。需要注意的是,批处理只在插入操作时起作用,更新和删除操作不会使用批处理。同时,批处理也可能会导致主键冲突等问题,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值