Java MYSQL / JDBC查询从缓存的Connection返回过时数据

我一直在搜索Stackoverflow的答案,但似乎找不到一个不涉及Hibernate或其他数据库包装器。

我通过Tomcat 6 Java EE应用程序中的MYSQL 5.18 JDBC驱动程序直接使用JDBC。 我正在缓存Connection对象,但不缓存Statement对象。 查询的ResultSet正确地在第一次运行时返回最新数据。 当我通过PHPMyAdmin或其他一些外部工具更改几行时,重新运行查询,我得到陈旧的过时数据。

我使用的是普通语句,而不是PreparedStatements。 我试过ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE。 我也在关闭结果集。 这些并不能解决问题。 我也尝试过ResultSet.refreshRows(),但这会导致错误,因为查询有一个JOIN子句。

唯一明确解决问题的是关闭Connection并重新连接到数据库,这会导致每次查询尝试的成本都很高。

有没有办法重用Connections而不返回陈旧数据?

编辑:我目前没有使用交易查询。

这是一般代码。

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

  

如果使用池连接,它将始终返回相同的结果!

更改mysql tx_isolation = READ_COMMITTED解决了我的问题。

为什么不使用Apache DBUtils使用JDBC池。 它允许您使用相同的连接并控制连接大小。 链接是http://commons.apache.org/dbutils