Я искал в Stackoverflow ответ, но, похоже, не могу найти ответ, в котором нет Hibernate или какой-либо другой оболочки базы данных.
Я использую JDBC напрямую через драйвер JDBC MYSQL 5.18 в приложении Tomcat 6 Java EE. Я кеширую объекты Connection, но не кеширую объекты Statement. ResultSets для запроса правильно возвращают обновленные данные при первом запуске. Когда я изменяю несколько строк с помощью 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();
Заранее спасибо за помощь!