【发布时间】:2012-03-08 12:34:00
【问题描述】:
我一直在 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 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 行为。
-
好问题。这些查询没有交易。我确实使用事务来进行更新/插入,但在这种特殊情况下,我现在没有在应用程序本身内执行任何操作。我正在通过一个外部工具进行更新,这可能会导致事情失败。如果您推荐事务作为防止脏读的解决方案,请分享答案。另外,我没有在连接上设置任何隔离级别。这会是问题吗?