私はSHA512アルゴリズムを使用してハッシュしようとしているプレーンテキストのすべてのユーザーパスワードを持つ100万行を超えるユーザーテーブル(Oracle 11g DB) (ハッシュと塩)。私のJavaクラスは、ユーザーテーブルからすべてのレコードを読み取り、ハッシュしてユーザーテーブルに更新することから始まります。私は準備された文が、私は自動に設定している JDBCを使用してOracleの100万行を選択して更新するパフォーマンスが低い
setFetchSize(1000)
)は-
私はを選択
の両方のために準備されたステートメントを使用しています
- とUPDATEは照会します一括更新を行うにはバッチ法を使用して
try {
ps = con.prepareStatement("update user set password=? where ID=?");
psSel = con.prepareStatement("select ID, password from user");
psSel.setFetchSize(1000);
rs = psSel.executeQuery();
String hashPassword = null;
while (rs.next()) {
long id = rs.getLong(1);
String pwd = rs.getString(2);
hashPassword = <<CALL TO PASSWORD HASHING UTIL>>;
ps.setString(1, hashPassword);
ps.setLong(2, id);
ps.addBatch();
//Every 5000 records update and commit
if(++count % batchSize == 0) {
ps.executeBatch();
con.commit();
}
}
ps.executeBatch();
con.commit();
} catch (SQLException e) {
e.printStackTrace();
}
100,000レコードを更新するには、上記の方法は8分近くかかると私はかなり高いと感じています。使用
データベース: Oracle 11gの
Javaバージョン: 1.6
環境:のWindows 7
私は私が何かをしないのですかどうかわからないです。そのようなバルク負荷を処理するための最善の方法をアドバイスまたは推奨できますか?
UPDATE
私は、一時テーブルにおける第二を見ていた - USER私は前に作成され、ID欄に追加何主キー制約はありませんでした見ることができました。私は先に進み、IDカラムのPK制約を追加し、私のユーティリティを再実行しました。今度は36秒を処理して100000行と処理しました。
私もUSER_TMP2がPK制約なしに別の一時テーブルを作成し、私のユーティリティを実行し、それがユーザーテーブルのビューを作成し、フェッチ10万
8分**ハッシュ** DB 100万レコードの更新が高く見えない –
データベース側でハッシュ関数をレプリケートできますか?もしそうならば、Javaとの間でネットワーク上のすべてのデータを移動する必要はありません。ここでボトルネックがどこにあるのかははっきりしない。 –
'DBMS_CRYPTO'で' HASH_SH512'を使わないのはなぜですか? – ppeterka