在旧的Oracle服务器上使用JDBC时,我有一个相当混乱和奇怪的问题(据我所知,这是一个8i)。我在那里准备了一张桌子,里面有大约10列,数字,varchars,一个原始(255)和一些日期,没有限制,没有键等等。在这一方面,一切都很快。之后,我的应用程序似乎非常慢(在大约30-50秒内插入25,000个数据......)。我的环境是来自10.2.0 Oracle的近乎最新的1.6 JDK,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数据库,速度非常快,甚至500,000个数据需要0毫秒才能将其插入相同的结构中(显然不是0毫秒,只是它太快以至于我无法测量它)。今天我将尝试使用ojdbc6和更新的oracle。我怀疑是ojdbc14驱动程序和jdk 1.6.idontknow彼此有一些问题。
我在使用FINEST级别处理 executeBatch 时追踪了ojdbc14,我看到了数以千计的转换, oracle.jdbc.driver.DBConversion.stringToDriverCharBytes 等等上。大部分时间都通过了这些代码而且最后的命令就像我看到的那样“真正的交易”。提交,参数化pstmt等等并不慢,只需执行executeBatch。
使用这个旧的jdbc驱动程序阅读FYI很快,只是插入速度非常慢。
那么,你们中有谁有想法?我可以用什么样的驱动程序来快速制作这些驱动程序,并且至少在一些基本操作中与所有可用的DB兼容?
答案 0 :(得分:0)
根据“数千次转换”可能的延迟判断,我建议使用Oracle OCI驱动程序。它应该更快,因为它通常是我,因为它是用本机代码编写的。除此之外,它很可能是网络延迟问题。