Tôi có bảng người dùng (Oracle 11g DB) với hơn 1 triệu hàng có tất cả mật khẩu người dùng trong văn bản thuần mà tôi đang cố gắng băm bằng thuật toán SHA512 (băm và muối). Để bắt đầu với dưới đây là lớp Java của tôi để đọc tất cả các bản ghi từ bảng người dùng, băm nó và cập nhật trở lại bảng người dùng.Hiệu năng kém để CHỌN và CẬP NHẬT một triệu hàng trong Oracle qua JDBC
- Tôi đang sử dụng tuyên bố chuẩn bị cho cả CHỌN và CẬP NHẬT truy vấn
- tôi đã thiết lập các tuyên bố chuẩn bị lấy kích thước 1000 (
setFetchSize(1000)
) - tôi đã thiết lập tự động cam kết tài sản để sai
- Sử dụng phương pháp hàng loạt để làm cập nhật hàng loạt
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();
}
Để cập nhật 100.000 bản ghi, phương pháp trên mất gần 8 phút mà tôi cảm thấy khá cao.
Cơ sở dữ liệu được sử dụng: Oracle 11g
Java Version: 1,6
Môi trường: Windows 7
Tôi không chắc chắn nếu tôi thiếu cái gì. Bạn có thể tư vấn hoặc giới thiệu cách tốt nhất để xử lý tải hàng loạt không?
CẬP NHẬT
Tôi đã xem xét thứ hai tại bảng temp - USER Tôi tạo ra trước và có thể thấy là không có Tiểu chế chính thêm vào cột ID. Tôi đã đi trước và thêm ràng buộc PK cho cột ID và chạy lại tiện ích của tôi. Bây giờ nó chỉ mất 36 giây để xử lý 100.000 hàng.
Để có đôi chắc chắn tôi cũng đã tạo ra một bảng temp USER_TMP2 mà không hạn chế PK và chạy tiện ích của tôi và nó mất 8 phút như thường lệ cho 100.000
8 phút đến ** băm ** và cập nhật trong DB 1 triệu bản ghi không có vẻ cao –
Bạn có thể sao chép hàm băm của mình ở phía cơ sở dữ liệu không? Bạn có thể làm một bản cập nhật duy nhất nếu có, mà không phải di chuyển tất cả dữ liệu trên mạng đến và từ Java. Nó không phải là rõ ràng, nơi nút cổ chai là ở đây mặc dù. –
Tại sao không sử dụng 'HASH_SH512' trong' DBMS_CRYPTO'? – ppeterka