Запрос Java MYSQL / JDBC возвращает устаревшие данные из кэшированного соединения

Я искал Stackoverflow в поисках ответа, но, похоже, не нашел ответа, который не использует Hibernate или какую-либо другую оболочку базы данных.

Я использую JDBC напрямую через драйвер JDBC MYSQL 5.18 в приложении Tomcat 6 Java EE. Я кэширую объекты 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();

Заранее спасибо за помощь!

5
задан Arjan Tijms 18 February 2012 в 14:21
поделиться