oracle - Oracle 批量更新速度慢

标签 oracle jdbc java-6 performance batch-updates

在旧的 Oracle 服务器(我被告知是 8i)上使用 JDBC 时,我遇到了一个非常令人困惑和奇怪的问题。我在那里准备了一个表,其中包含大约 10 列、数字、varchars、一个 raw(255) 和一些日期,没有限制,没有键等。在这方面,大概一切都很快。之后,我的应用程序似乎真的很慢(在大约 30-50 秒内插入 25,000 条数据......)。我的环境是几乎最新的 1.6 JDK,来自 10.2.0 Oracle 的 ojdbc14 驱动程序。 所以我删掉了那个代码部分并分别测试了这些东西。有关代码的一些背景信息,这是它的基本部分

Class.forName("oracle.jdbc.driver.OracleDriver"); // I tried with oracle.jdbc.OracleDriver too
Connection conn = DriverManager.getConnection("thin url", "user", "pass");
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement(SQL_STMT); // SQL_STMT is a simple <i>INSERT INTO tablename (column1, column2, column3) VALUES (value1, value2, value3)</i> command with 10 parameters

for(int i = 0; i < numOfData; ++i) {
   pstmt.setObject(objects[i]); // objects has the data for example. I also tried setInt, setDate, etc with the corresponding types, does not speeds it up
   pstmt.addBatch();
}
pstmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
pstmt.close();
conn.close();

我觉得这很简单。我还尝试使用本地 H2 DB 进行此操作,速度非常快,即使是 500,000 个数据也需要 0 毫秒才能将其插入到相同的结构中(显然不是 0 毫秒,只是速度太快以至于我无法测量它)。我今天将尝试使用 ojdbc6 和更新的 oracle。我怀疑是 ojdbc14 驱动程序和 jdk 1.6.idontknow 之间存在一些问题。

我在处理具有 FINEST 级别的 executeBatch 时追踪了 ojdbc14,我看到了数以千计的转换,oracle.jdbc.driver.DBConversion.stringToDriverCharBytes 等等在。大多数时间都是通过这些代码传递的,只有最后的命令才是我所看到的“真正的交易”。提交、设置 pstmt 参数等并不慢,只是 executeBatch。

仅供引用,使用这个旧的 jdbc 驱动程序读取速度很快,只是插入速度非常慢。

那么,你们有什么想法吗?我可以使用哪种驱动程序来加快这些速度并至少在一些基本操作方面与所有可用的数据库兼容?

最佳答案

从“千次转换”可能的延迟来看,我建议使用 Oracle OCI 驱动程序。它应该比我通常更快,因为它是用 native 代码编写的。除此之外,很可能是网络延迟问题。

关于oracle - Oracle 批量更新速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10328408/

相关文章:

java - 按数组选择数据。 sql

oracle死锁超时配置

Java JDBC 工作流

java - 如何在存在另一个提供程序的情况下使用 java 内部 XMLStreamWriter

java (jdk 1.6) 正则表达式

java - 通过命令行增加Java中的MaxPermSize内存

database - 使用不带 Service_Name 的 SID 将 .NET Core WebApp 连接到 Oracle

database - Oracle SQL 开发人员中的 DB2 数据库

mysql - 并发请求时 Hikari CP 连接错误

java - ResultSet 可以用于直接填充表吗?