Java JDBC从不同的调用返回重复的结果集

时间:2012-08-09 16:52:41

标签: java mysql jdbc

我正在构建一个与MYSQL数据库对话的java Web应用程序。当请求进来时,有几件事情需要完成。

首先,我必须验证一些数据。为此,我有一个静态方法,它传递一些数据并验证它是否准确。部分验证要求我使用另一个返回ResultSet的静态方法查询数据库

即Web应用程序调用Validate(String data)调用queryData()

当我这样做时,运行正常。

现在,在调用数据之后,我调用了另一个将一些数据插入数据库的静态函数。此插入函数调用(有时但不总是)完全相同的queryData函数来获取数据。

即web app调用insertData(data)调用queryData()。 所以程序流程如下

Webapp
|----> Validate()
          |-------->queryData()
           <-----------|
<---------|
|
|------>insertData()
          |-------->queryData()
           <-----------|
<---------|

我使用在queryData方法中本地定义的PreparedStatement查询数据库

正如我所说,验证方法工作正常,但是当涉及到insert方法时,应用程序崩溃了。

我仔细检查过两种情况下SQL语句是否相同,我甚至打印出结果集的内存位置,它们位于不同的位置。但是,当我打印出结果集的isBeforeFirst()时,它在验证方法中为true,但在insert方法中为false。

似乎JDBC正在返回ResultSet的副本(它保存在不同的内存位置),但它实际上并没有创建一个位于第一行之前的新ResultSet。

简单的解决方案是简单地将resultSet返回到之前,但这并不能解决问题。它仍然表示resultSet不是在第一次之前。

有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

愚蠢的我,我找到了原因。在调用queryData函数之前,我实际上正在修改数据,以便查询函数的结果将返回一个空集。在我调用queryData之后,应用程序将尝试读取数据,导致SQLException并在我修改任何内容之前回滚数据库,因此我从未发现查询之间存在任何差异。

感谢所有试图提供帮助的人。