古いOracleサーバー(私が言われたように8iです)でJDBCを使用すると、非常に紛らわしく奇妙な問題があります。そこに、約10列、数値、varchar、raw(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 DB で試してみました。これは非常に高速で、同じ構造に挿入するのに 500,000 データでも 0 ミリ秒かかりました (明らかに 0 ミリ秒ではなく、測定できないほど速かっただけです)。今日は ojdbc6 と新しいオラクルを試してみます。私の疑いは、ojdbc14 ドライバーと jdk 1.6.idontknow が互いに問題を抱えていることです。
FINEST レベルのexecuteBatchで作業しているときに ojdbc14 を追跡したところ、 oracle.jdbc.driver.DBConversion.stringToDriverCharBytesなど、何千もの変換があったと思います。ほとんどの時間はこれらのコードと共に過ぎ、私が見たように最後のコマンドだけが「本物」でした。コミット、pstmt のパラメータ設定などは遅くなく、executeBatch だけでした。
参考までに、この古い jdbc ドライバーを使用した読み取りは高速でしたが、挿入だけは恐ろしく遅かったです。
それで、あなたの中にアイデアがありますか?これらを高速化し、少なくともいくつかの基本的な操作で利用可能なすべての DB と互換性を持たせるために、どのようなドライバーを使用できますか?