【发布时间】:2012-03-21 05:06:22
【问题描述】:
这是我的应用程序的基本概要(它连接到一个 SQLite DB):
它会扫描一个目录并创建一个包含 8-15 个需要读取的不同平面文件的列表。
它识别平面文件并根据文件扩展名选择通用的预处理语句。
然后它逐行读取平面文件,并将准备好的语句与已设置的字符串添加到批处理中。批处理每 1,000 条语句执行一次。一些有问题的文件有 200,000 行需要读取。
将所有文件插入数据库后(每种文件类型都有不同的表),程序会将每个表的特定列更新为一个公共值。
程序为每种文件类型创建一个新文件,并将数据库中的信息提取到新文件中。
目前,在一个包含大约 9 个非常小文件(少于 50 行)和一个非常大文件(超过 200,000 行)的目录上运行大约需要 1.5 分钟。我希望能更快。
几个第一个问题:
我应该关闭和打开程序每个部分的数据库连接(加载、更新、提取)还是保持连接打开并将其传递给每个不同的方法。
我应该在处理完每个文件后关闭准备好的语句吗?或者只是在每个文件之后清除参数并在方法结束时关闭它(基本上是在加载所有作业之后)?
我对任何其他 cmet 感兴趣,我应该专注于最大限度地提高此应用程序的性能。
谢谢。
【问题讨论】:
-
究竟哪个部分花费的时间最多?进行基准测试,找出并告诉我们。
-
你记得禁用自动提交吗?
-
稍微扩展一下 Christoffer:你怎么知道问题在于 JDBC 性能,而不是读取文件内容、解析数据并将数据传递给准备好的代码声明?
-
自动提交已禁用。我在 Eclipse 中运行了一些执行时间分析。运行 121 秒。其中 64 秒提交给将 200,000 文件加载到数据库中的方法。为了比较 0.08396 秒,该方法将 900 行的文件加载到数据库中。 44 秒用于更新所有十个数据库表的方法。
-
承诺 4.5 秒从数据库中提取所有十个作业并将它们写入新的平面文件。
标签: java jdbc sqlitejdbc