3

在旧的 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 驱动程序读取速度很快,只是插入速度非常慢。

那么,大家有什么想法吗?我可以使用什么样的驱动程序来使这些更快并至少与一些基本操作兼容所有可用的数据库?

4

1 回答 1

0

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

于 2012-07-12T17:29:31.390 回答