java - 编写数据加载器的最佳方法是什么?

标签 java spring hibernate

我正在使用 Spring 2.5 和与之配套的 Hibernate。我正在针对 Oracle 11g 数据库运行。

我已经创建了扩展 HibernateTemplate 的 DAO。现在我想编写一个加载程序,在我的 person 表中插入 500 万行。我以一种简单的方式编写了这个,就像从 CSV 文件中读取一行,将其转换为一个人,保存到表中。继续执行此操作,直到 CSV 文件为空。

问题是我在大约 450000 行处用完了堆空间。因此,我将内存大小从 1024m 加倍到 2048m,现在在大约 900000 行后内存耗尽。

嗯嗯......

所以我读过一些关于关闭 Hibernate 查询缓存的内容,但我没有使用 L2 缓存,所以我认为这不是问题所在。

我读过一些有关 JDBC2 批处理的内容,但我认为这不适用于 hibernate。

所以,我想知道我是否遗漏了 Hibernate 的一些基本功能。

最佳答案

说实话,我不会为此使用 hibernate。 ORM 的设计目的不是将数百万行加载到数据库中。不是说不能,但这有点像用电钻挖游泳池;你会使用挖掘机,而不是钻机。

就您而言,我会使用数据库附带的加载应用程序将 CSV 直接加载到数据库中。如果您不想这样做,是的,批量插入会更有效。但我认为 Hibernate 不会让你轻松做到这一点。如果我是你,我只会使用普通 JDBC,或者最多使用 Spring JDBC。

如果实体中有复杂的业务逻辑并且绝对必须使用 Hibernate,那么您可以按照 Richard 的建议刷新每 N 条记录。但是,我认为这是一个非常糟糕的黑客行为。

关于java - 编写数据加载器的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17884576/

相关文章:

java - java arrayList remove(element) 的时间复杂度

java - 通过 AJAX CALL 从 SPRING MVC 3 CONTROLLER 获取 JAVA LIST 到 JQUERY 的示例程序

java - 编码-解码字符串

java - 为什么在实例初始值设定项内不允许递增 (`x++;` )但未声明的字段,但如果包装到匿名类中则可以?

java - webelement 列表中的一些 webelements 值变为空白 如何等待 webelement 的每个值出现在 selenium 的 webelements 中

java - Web 应用程序中的 Spring 线程

java - 限制 CrudRepository 中的创建操作,仅允许编辑操作

java - 如何根据特定顺序对 hibernate 结果进行排序

java - 如何使用反射检查 hibernate 映射?

java - Hibernate 配置创建 hbm 和 POJO