約更新を試みています。二段階の表に3800行:0 UCanAccessを使用して同じテーブルを使用した後続のクエリのパフォーマンスが低い
- セットのすべての値は計算値にループ内でそれらのいくつかを設定
最初のステップは、高速(< 1S)であります。しかし、2番目のステップは約3秒かかります。たぶんコードに問題があるかもしれません。なぜなら、最初のステップを使わないでコードを実行したり、別のテーブルで最初のクエリを実行したりすると、2番目のステップも非常に高速です(< 0.1秒)。同じテーブルの最初のステップの後に実行されるときだけ遅いです。
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
conn = DriverManager.getConnection("jdbc:ucanaccess://"
+ path +;singleconnection=true" ,"", "");
// First update (reset all values)
long start = System.currentTimeMillis();
PreparedStatement ps2 = conn.prepareStatement("UPDATE mytab SET val = 0.0;");
ps2.executeUpdate();
ps2.close();
System.out.println("Update 1: " + (System.currentTimeMillis()-start)/1000.0 + " s");
// Second update
start = System.currentTimeMillis();
conn.setAutoCommit(false);
int count = 0;
PreparedStatement ps = conn.prepareStatement("UPDATE mytab SET val = ? WHERE id = ?;");
for(int j= 1; j <= 3600; j++){
double value;
// calculate some value ....
value = 1.3;
// update table under certain conditions
if(true){
ps.setDouble(1, value);
ps.setInt(2, j);
ps.addBatch();
count++;
}
if(count > 200){
ps.executeBatch();
count = 0;
}
}
ps.executeBatch();
conn.commit();
System.out.println("Update 2: " + (System.currentTimeMillis()-start)/1000.0 + " s");
なぜ、2番目のステップが長くかかるのですか?これを避ける方法は?
(私はすでに同じ質問をhereにしましたが、成功しませんでした)。
編集:私は古いJDBC-ODBCブリッジ(とJava 7)との2つのクエリをしようとした場合 は、2番目のクエリは非常に高速(< 1秒)である第一の後に実行。だから私はUCanAccessの問題でなければならないと思う。
代わりに '価値= 1.3;'てみてください'value =((Long)start).doubleValue();'最初にゼロをゼロにしなくても常に行を更新するようにします。同じテストを同じ 'value'で連続して2回実行するなど、行が変更されない場合、テストはデータベースファイルに書き戻されず、2回目の実行がはるかに速く終了するため、テストが欺かれている可能性があります最初のものより.. –
ところで、MySQLはこれと何をする必要がありますか? –
@GordThompson:Uuuh、真、テストは誤解を招く、ちょうど を実現していない! (Real)のアップデートはいずれの場合も3秒かかる。 これをスピードアップする方法はありますか? JDBC-ODBCはずっと高速です。 – Sophia