2012-04-26 13 views
3

古い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と互換性がありますか?

+0

リンゴをリンゴと比較していますか?たとえば、Oracleインスタンスがリモート・サーバーの場合、ネットワーク・レイテンシ時間をカウントしていますか? – Nick

+0

これはリモートですが、以前のいくつかのプロジェクトとoracle db-sの経験に基づいて比較しています。実際には上のコードは明らかに予想よりも遅いです。 そして、私はまだ何かの時間がある場合、原因を見つけるために私は数日前に、私は正確なドライバでDBでこれを試してみました、それは遅いですが、これより遅くはありませんでした。しかし、そのテストは予想されたスピードを超えていました。 – newhouse

+0

*私は "予想される時間"を意味しました – newhouse

答えて

0

"数千回の変換"で潜在する可能性があると判断して、Oracle OCIドライバの使用をお勧めします。それはネイティブコードで書かれているので、通常は私のために速いはずです。それ以外の場合は、ネットワークレイテンシの問題である可能性が最も高いです。

+1

Oracleマニュアルでは、thinドライバがOCIドライバより高速であるとOracle自身が主張しています。 –