古いOracleサーバー(私が言われたように8iです)でJDBCを使用すると、かなり混乱して奇妙な問題が発生します。私は約10の列、数字、varchars、未加工(255)とその中の日付、制限なし、鍵なしなどでテーブルを用意しました。その側では、すべてがおそらく高速です。その後、私のアプリケーションは非常に遅いようでした(約30〜50秒で25,000データを挿入...)。私の環境は、最新の1.6 JDK、10.2.0 Oracleのojdbc14ドライバです。 私はそのコード部分を切り出し、これらのものを別々にテストしました。コードに関するいくつかの背景情報はここにあります。Oracleで遅いバッチ更新
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でこれを試みました。それは素早く速く、50万データでも同じ構造(0msではないことは明らかでした。今日はojdbc6と新しいオラクルで試してみます。私の疑問は、ojdbc14ドライバとjdk 1.6.idontknowはお互いにいくつかの問題があることです。
FINESTレベルでがexecuteBatchで作業するとき、私はojdbc14を下にトレースして、私はそうで変換数千人の私が思うに、 oracle.jdbc.driver.DBConversion.stringToDriverCharBytesとを見ました。ほとんどの時間は、これらのコードで渡され、最後のコマンドだけが私が見たように「実際の取引」でした。コミット、pstmtのパラメータ設定などは遅くはなく、単にexecuteBatchです。
この古いjdbcドライバでは、読み込みが高速だっただけで、挿入がひどく遅かったです。
だから、皆さんのアイデアはありますか?どのようなドライバーを使用してこれらの高速化を行い、少なくともいくつかの基本操作ですべての使用可能なDBと互換性がありますか?
リンゴをリンゴと比較していますか?たとえば、Oracleインスタンスがリモート・サーバーの場合、ネットワーク・レイテンシ時間をカウントしていますか? – Nick
これはリモートですが、以前のいくつかのプロジェクトとoracle db-sの経験に基づいて比較しています。実際には上のコードは明らかに予想よりも遅いです。 そして、私はまだ何かの時間がある場合、原因を見つけるために私は数日前に、私は正確なドライバでDBでこれを試してみました、それは遅いですが、これより遅くはありませんでした。しかし、そのテストは予想されたスピードを超えていました。 – newhouse
*私は "予想される時間"を意味しました – newhouse