我有一個擁有超過100萬行的用戶表(Oracle 11g數據庫),其中包含純文本中的所有用戶密碼,我嘗試使用SHA512算法(散列和鹽)。從下面開始我的Java類讀取用戶表中的所有記錄,將其散列並更新回用戶表。通過JDBC在Oracle中選擇和更新一百萬行的性能差
- 我使用準備好的聲明中兩個選擇和UPDATE查詢
- 我已準備好的語句獲取大小爲1000(
setFetchSize(1000)
) - 我已經設置了自動提交屬性設置爲false
- 使用批處理方法做批量更新
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我之前創建的,可以看到沒有PRIMARY KEY約束加入ID列。我繼續爲ID列添加PK約束,並重新運行我的實用程序。現在只需要36秒來處理100,000行。
雙待確定我還創造了另一個臨時表USER_TMP2沒有PK限制,跑到我的效用,並花了8分鐘像往常一樣
8分鐘到**哈希**並在數據庫中更新100萬條記錄看起來不高 – 2016-08-19 17:51:14
您是否能夠在數據庫端複製哈希函數?如果可以的話,你可以做一次更新,而不必通過網絡將所有數據移入和移出Java。目前尚不清楚這裏的瓶頸在哪裏。 –
爲什麼不在'DBMS_CRYPTO'中使用'HASH_SH512'? – ppeterka