0

我正在开发一个将文件解析为列表然后将数据插入数据库的 java 程序。这在具有大量内存的服务器上运行。我需要注意 Java 限制吗?

例如,我不应该在将 GB 的数据插入数据库之前将其解析为列表?

4

5 回答 5

1

您需要担心的不仅仅是 Java 的限制。

存在网络带宽使用、占用数据库服务器 CPU、填满数据库事务日志、大量插入的 JDBC 性能、数据库更新其索引或生成人工密钥时的缓慢性。

如果您的输入变得太大,您需要将它们分成块并分别提交这些块。多大是太大取决于您的数据库。

分配人工密钥的方式可能会减慢进程,您可能需要提前创建批量值,例如使用 hilo 生成器。

启动一堆线程并用它们锤击数据库服务器只会引起争用并使数据库服务器更努力地工作,因为它必须整理事务并确保它们不会相互干扰。

考虑写入某种分隔文件,然后运行批量插入实用程序将其内容加载到数据库中。这样数据库实际上可以协作,它可以暂停更新索引和检查约束,并且序列和事务不是问题。它比 JDBC 快几个数量级。

于 2013-11-05T22:08:09.730 回答
1

Nathans 的回答很不错 - 所以我只会在这里添加一些内容......

如果你没有在你的程序中做任何非常复杂的事情,那么以流方式编写可能是一个好习惯 - 简单来说,一次读取一行输入,然后直接将其输出到文件中,最后调用数据库的特定(大多数都有一个)批量上传工具。

将所有行读入内存,然后在循环中调用 insert() 将非常低效。

你没有给我们很多关于你为什么要一口气读完这些数据的线索——有必要这样做吗?

于 2013-11-05T22:15:43.047 回答
0

您可能需要注意的限制是

  • 列表不能有 2^31 个或更多条目。
  • JVM 确实可以很好地扩展到 32 GB,但不会因为 GC 成本随着堆大小而增加(除非你有 Azul 的 Zing)

如今,大量内存为 256 - 512 GB,如果您在一个 JVM(或 Zing)中需要超过 32 GB 的内存,我建议您使用堆外内存。

于 2013-11-05T21:48:15.637 回答
0

这取决于您为 JVM 分配了多少内存。

您可以分配给 JVM 的内存量再次取决于客户端 VM(或)服务器 VM 类型。

检查-Xmx-Xms 设置

于 2013-11-05T21:45:38.287 回答
0

不是直接的,但您可能想稍微调整一下 JVM 参数。

启动 JVM 时的 Xms 和 Xmx 参数是什么?可能是一个有用的参考。

于 2013-11-05T21:45:55.710 回答