Tôi đã tìm kiếm Stackoverflow cho câu trả lời nhưng dường như không tìm thấy câu trả lời không liên quan đến Hibernate hoặc một số trình bao bọc cơ sở dữ liệu khác.Truy vấn Java MYSQL/JDBC đang trả về dữ liệu cũ từ kết nối được lưu trong bộ nhớ cache
Tôi đang sử dụng JDBC trực tiếp qua trình điều khiển JDBC MYSQL 5.18 trong ứng dụng Java EE 6 của Tomcat. Tôi đang lưu trữ các đối tượng Connection, nhưng không phải caching các đối tượng Statement. ResultSets cho truy vấn được trả về chính xác dữ liệu cập nhật trong lần chạy đầu tiên. Khi tôi thay đổi một vài hàng thông qua PHPMyAdmin hoặc một số công cụ bên ngoài khác, chạy lại truy vấn, tôi nhận được dữ liệu cũ đã lỗi thời.
Tôi đang sử dụng các câu lệnh bình thường, chứ không phải Báo cáo chuẩn bị. Tôi đã thử ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE. Tôi cũng đang đóng bộ kết quả. Những điều này không giải quyết được vấn đề. Tôi cũng đã thử ResultSet.refreshRows(), nhưng kết quả là một lỗi vì truy vấn có một mệnh đề JOIN.
Điều duy nhất giải quyết rõ ràng vấn đề là đóng kết nối và kết nối lại với cơ sở dữ liệu, dẫn đến chi phí cao cho mỗi lần thử truy vấn.
Có cách nào để sử dụng lại các Kết nối mà không trả lại dữ liệu cũ?
EDIT: Tôi hiện không sử dụng giao dịch cho các truy vấn.
Đây là mã chung.
Connection conn; //created elsewhere and reused
...
String query = "SELECT p.ID as oid,rid,handle,summary,city,state,zip,t.name AS category
FROM profiles AS p
JOIN (terms AS t) ON (p.tid = t.ID)
WHERE p.ID = 1";
ResultSet resultSet;
Statement s;
synchronized (conn)
{
s = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
resultSet = s.executeQuery(query);
}
//Iterate over the results using .next() and copy data to another data structure
List retval = getResults(resultSet);
s.close();
Cảm ơn bạn đã trợ giúp trước!
Bạn đang sử dụng giao dịch? Nếu vậy mức cô lập là gì? Nó có vẻ giống như hành vi READEATABLE READ. –
Câu hỏi hay. Không có giao dịch cho các truy vấn này.Tôi sử dụng giao dịch cho các cập nhật/chèn nói chung, nhưng trong trường hợp cụ thể này, tôi không thực hiện bất kỳ giao dịch nào trong chính ứng dụng ngay bây giờ. Tôi đang làm các CẬP NHẬT thông qua một công cụ bên ngoài mà có thể được ném những thứ đi. Nếu bạn đề xuất các giao dịch như một giải pháp để ngăn ngừa đọc bẩn, vui lòng chia sẻ câu trả lời. Ngoài ra, tôi đã không đặt bất kỳ mức độ cô lập trên kết nối. Đó có phải là vấn đề? – ricosrealm