【问题标题】:How to improve JDBC performance with my application如何使用我的应用程序提高 JDBC 性能
【发布时间】:2012-03-21 05:06:22
【问题描述】:

这是我的应用程序的基本概要(它连接到一个 SQLite DB):

  1. 它会扫描一个目录并创建一个包含 8-15 个需要读取的不同平面文件的列表。

  2. 它识别平面文件并根据文件扩展名选择通用的预处理语句。

  3. 然后它逐行读取平面文件,并将准备好的语句与已设置的字符串添加到批处理中。批处理每 1,000 条语句执行一次。一些有问题的文件有 200,000 行需要读取。

  4. 将所有文件插入数据库后(每种文件类型都有不同的表),程序会将每个表的特定列更新为一个公共值。

  5. 程序为每种文件类型创建一个新文件,并将数据库中的信息提取到新文件中。

目前,在一个包含大约 9 个非常小文件(少于 50 行)和一个非常大文件(超过 200,000 行)的目录上运行大约需要 1.5 分钟。我希望能更快。

几个第一个问题:

  1. 我应该关闭和打开程序每个部分的数据库连接(加载、更新、提取)还是保持连接打开并将其传递给每个不同的方法。

  2. 我应该在处理完每个文件后关闭准备好的语句吗?或者只是在每个文件之后清除参数并在方法结束时关闭它(基本上是在加载所有作业之后)?

我对任何其他 cmet 感兴趣,我应该专注于最大限度地提高此应用程序的性能。

谢谢。

【问题讨论】:

  • 究竟哪个部分花费的时间最多?进行基准测试,找出并告诉我们。
  • 你记得禁用自动提交吗?
  • 稍微扩展一下 Christoffer:你怎么知道问题在于 JDBC 性能,而不是读取文件内容、解析数据并将数据传递给准备好的代码声明?
  • 自动提交已禁用。我在 Eclipse 中运行了一些执行时间分析。运行 121 秒。其中 64 秒提交给将 200,000 文件加载到数据库中的方法。为了比较 0.08396 秒,该方法将 900 行的文件加载到数据库中。 44 秒用于更新所有十个数据库表的方法。
  • 承诺 4.5 秒从数据库中提取所有十个作业并将它们写入新的平面文件。

标签: java jdbc sqlitejdbc


【解决方案1】:

我会先做接下来的事情:
1) 使用像DBCP这样的JDBC连接池
2) 拆分作业,在单独的线程中读取文件并将数据推送到 DB,以便一个线程处理一个文件并将完成的标志写入一个表
3) 逆向处理也一样

打开/关闭连接是一项昂贵的操作 - 因此您应该打开一次并在所有操作完成后关闭。
语句也一样。 Prepared statement (以及其他) - 是 JDBC 驱动程序编译的语句,可提高其执行性能;您在开始时创建一次并在所有工作完成后关闭。

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多