带弹簧/休眠的散装插件

Lau*_*t K 8 spring hibernate bulkinsert

我在我的应用程序中使用混合Spring/Hibernate(没有原创).对于给定的功能,我必须将CSV文件的内容导入到Oracle DB的表中.就目前而言,我这样做是为了创造对象

   HibernateTemplate.saveOrUpdate
Run Code Online (Sandbox Code Playgroud)

在他们每个人(我需要检索他们新分配的Id)

然后使用Spring事务API在方法结束时进行事务.

一切都很好,除了性能,这对于5000个物体是正确的,但不是10万个......

所以我寻找加速这些东西的想法.我听说过Hibernate的批量插入,但找不到任何可靠的引用.任何人都可以给我一些想法,以更高的性能执行此导入吗?

Mic*_*les 7

你可能尝试的简单方法是刷新并清除会话说每100个对象......

所以执行

session.flush();
session.clear();
Run Code Online (Sandbox Code Playgroud)

每100或1000个插入.

这将刷新并清除hibernate会话并阻止它变得太大(可能为什么你的10万个对象需要这么长时间).

此外,如果你使用身份标识符生成器,​​hibernate会默默地关闭批量插入.批量插入将提高性能.您还需要在时间编号上指定等效于100的hibernate.jdbc.batch_size配置属性.

Manning的Java Persistence with Hibernate是这个的源头(伟大的书 - 多次拯救我的皮肤).


Ray*_*Ray 6

您还可以考虑使用StatelessSession,因为它是为批量操作而设计的.

StatelessSession ss=sessionFactory().openStatelessSession();
Transaction tx=ss.beginTransaction();
Run Code Online (Sandbox Code Playgroud)