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

Я искал Stackoverflow для ответа, но не могу найти тот, который не связан с Hibernate или какой-либо другой оболочкой базы данных.

Я использую JDBC напрямую через драйвер JSBC MYSQL 5.18 в приложении Java EE Tomcat 6. Я кэширую объекты Connection, но не кеширует объекты Statement. ResultSets для запроса корректно возвращают обновленные данные при первом запуске. Когда я изменяю несколько строк через PHPMyAdmin или какой-либо другой внешний инструмент, повторите запрос, я получаю устаревшие устаревшие данные.

Я использую обычные заявления, а не PreparedStatements. Я пробовал ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE. Я также закрываю результирующий набор. Это не решает проблему. Я также попробовал ResultSet.refreshRows (), но это приводит к ошибке, потому что запрос имеет предложение JOIN.

Единственное, что ясно решает проблему, заключается в закрытии соединения и повторном подключении к базе данных, что приводит к большой стоимости для каждой попытки запроса.

Есть ли способ повторно использовать соединения без возврата устаревших данных?

EDIT: Я не использую транзакции для запросов на данный момент.

Вот общий код.

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(); 

Спасибо за помощь в продвижении!

Оказывается, это вопрос нерешенных запросов. Спасибо Brent Worden за вопрос о транзакциях, который заставил меня осмотреться и заметить, что я отключил автоматическую фиксацию и не выполнял запросы.

Итак, решения, которые работали на меня:

 conn.setAutoCommit(true); 

или

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

Это позволяет сбросить запросы, а устаревшие данные предотвращаются.

Установите уровень изоляции транзакции, как показано ниже.

connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

моя установка mysql: ENGINE = InnoDB, по умолчанию tx_isolation = REPEATABLE_READ

spring.xml

  

если использовать объединенное соединение, которое всегда будет возвращать одинаковые результаты!

change mysql tx_isolation = READ_COMMITTED разрешил мою проблему.

Почему вы не используете пулы JDBC, используя Apache DBUtils. Он позволяет использовать одно и то же соединение, а также контролировать размер соединений. Ссылка: http://commons.apache.org/dbutils