返回陳舊的數據我一直在尋找#1的答案,但似乎無法找到一個不涉及休眠或一些其他數據庫的包裝。MYSQL的Java/JDBC查詢是從緩存的連接
我通過在Tomcat 6的Java EE應用程序的MYSQL 5.18 JDBC驅動程序直接使用JDBC。我正在緩存Connection對象,但沒有緩存Statement對象。查詢的結果集正確返回第一次運行的最新數據。當我通過PHPMyAdmin或其他外部工具更改了幾行時,重新運行查詢,我得到過時的數據。
我使用正常的語句,而不是PreparedStatements。我試過ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE。我也關閉了結果集。這些都不能解決問題。我也試過ResultSet.refreshRows(),但是這會導致錯誤,因爲查詢有一個JOIN子句。
,明確解決的問題是關閉連接,並重新連接到數據庫,從而導致每個查詢嘗試了沉重的代價的唯一的事情。
有沒有辦法重用連接而不返回陳舊的數據?
編輯:我目前沒有使用交易進行查詢。
這裏是一般的代碼。
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();
感謝您的幫助!
您使用的是交易嗎?如果是的話隔離級別是什麼?它看起來有點像REPEATABLE READ行爲。 – 2012-02-17 04:25:37
好問題。沒有這些查詢的交易。我一般使用事務處理更新/插入,但在這種情況下,我現在不在應用程序本身中執行任何操作。我正在通過一個外部工具來完成更新,這個工具可能會拋出一些東西。如果您推薦交易作爲防止髒讀的解決方案,請分享答案。另外,我沒有在連接上設置任何隔離級別。那會是問題嗎? – ricosrealm 2012-02-17 05:05:50