Chúng tôi có một ứng dụng luồng công việc Java sử dụng cơ sở dữ liệu Oracle để theo dõi các bước và tương tác của nó với các dịch vụ khác. Trong một luồng công việc chạy một số chèn/cập nhật/lựa chọn được thực hiện và đôi khi lựa chọn sẽ không trả về dữ liệu cập nhật, mặc dù chèn/cập nhật cam kết chạy trước khi nó hoàn tất thành công. Sau khi các luồng công việc bị lỗi (do dữ liệu xấu), nếu chúng ta quay trở lại và kiểm tra cơ sở dữ liệu thông qua ứng dụng của bên thứ 3, dữ liệu mới/cập nhật sẽ hiển thị. Dường như có sự chậm trễ giữa khi các cam kết của chúng ta trải qua và khi chúng được hiển thị. Điều này xảy ra trong khoảng 2% của tất cả các dòng chảy công việc và nó tăng lên trong quá trình sử dụng cơ sở dữ liệu nặng.Độ trễ của Oracle giữa cam kết và chọn
Nhóm hỗ trợ cơ sở dữ liệu của chúng tôi đề xuất thay đổi tham số max-commit-propagation-delay thành 0, mặc định là 700. Đây dường như là giải pháp khả thi nhưng cuối cùng không khắc phục được sự cố của chúng tôi.
Ứng dụng chạy trên WebSphere và cơ sở dữ liệu Oracle được cấu hình dưới dạng nguồn dữ liệu JDBC. Chúng tôi đang sử dụng Oracle 10.1g. Ứng dụng được viết bằng Java 1.5.
Mọi trợ giúp sẽ được đánh giá cao.
chỉnh sửa: mẫu mã
DataSource ds; // spring configured
String sql = "INSERT INTO " + currentTable + " (" + stepId + ',' + stepEntryId + ", " + stepStepId + ", " + stepActionId + ", " + stepOwner + ", " + stepStartDate + ", " + stepDueDate + ", " + stepFinishDate + ", " + stepStatus + ", " + stepCaller + ") VALUES (?, ?, ?, null, ?, ?, ?, null, ?, null)";
Connection conn = ds.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
// set values
stmt.executeUpdate();
// close connections
// later on in the code...
Connection conn = ds.getConnection();
PreparedStatement stmt = null;
ResultSet rset = null;
String sql = "SELECT " + stepId + ", " + stepStepId + ", " + stepActionId + ", " + stepOwner + ", " + stepStartDate + ", " + stepDueDate + ", " + stepFinishDate + ", " + stepStatus + ", " + stepCaller + " FROM " + currentTable + " WHERE " + stepEntryId + " = ?";
stmt = conn.prepareStatement(sql);
stmt.setLong(1, entryId);
rset = stmt.executeQuery();
//close connections
Từ [Tài liệu Oracle] (http://download.oracle.com/docs/cd/B14117_01/server.101/b10755/initparams115.htm), có vẻ như tham số 'max_commit_propagation_delay' chỉ áp dụng cho thiết lập RAC. Bạn đang kết nối với một cá thể RAC? –
Dữ liệu có được cam kết như một phần của giao dịch không? Hoặc đọc? –