2012-02-17 31 views
5

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!

+2

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. –

+0

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

Trả lời

9

Hóa ra đó là vấn đề của các truy vấn không được yêu cầu. Nhờ Brent Worden cho câu hỏi về các giao dịch mà dẫn tôi nhìn xung quanh và thông báo rằng tôi đã vô hiệu hóa tự động cam kết và không cam kết sau khi truy vấn.

Vì vậy, các giải pháp mà làm việc cho tôi:

conn.setAutoCommit(true); 

hoặc

statement.executeQuery(query); 
conn.commit(); 

Điều này cho phép các truy vấn được xả ra ngoai và dữ liệu cũ được ngăn chặn.

+0

bạn có thể đánh dấu câu trả lời này là câu trả lời không? theo cách đó, mọi người có thể tìm thấy bài đăng này và đọc vấn đề và giải pháp của bạn :). –

+0

tôi sẽ trong 2 ngày. Tôi không thể vào lúc này vì trang web sẽ không cho phép tôi. – ricosrealm

+0

nghĩa là 'conn.commit(); 'phải không? –

0

Tại sao bạn không sử dụng các nhóm JDBC bằng Apache DBUtils. Nó cho phép bạn sử dụng cùng một kết nối và cũng kiểm soát kích thước kết nối. Liên kết là http://commons.apache.org/dbutils

+0

Cảm ơn con trỏ. Tôi có thể thử và xem mã này. Tuy nhiên tôi đang cố gắng để làm một cái gì đó rất đơn giản ở đây mà không có một wrapper mã lớn hơn. – ricosrealm

3

Đặt mức cách ly giao dịch như dưới đây.

connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

1

cài đặt của tôi mysql: ENGINE = InnoDB, tx_isolation mặc định = REPEATABLE_READ

spring.xml

<tx:method name="find*" propagation="SUPPORTS" read-only="true" timeout="600" /> 

nếu sử dụng kết nối gộp mà sẽ luôn luôn trả về kết quả tương tự!

thay đổi mysql tx_isolation = READ_COMMITTED đã giải quyết được sự cố của tôi.

Các vấn đề liên quan