我正在使用 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/