0

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

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

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

当我这样做时,它运行良好。

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

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

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

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

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

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

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

简单的解决方案是先将结果集返回到之前,但这并不能解决问题。它仍然说 resultSet 不是在 first 之前。

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

4

1 回答 1

0

我傻了,我找到了原因。就在调用 queryData 函数之前,我实际上是在修改数据,以便查询函数的结果返回一个空集。在我调用 queryData 后,应用程序将尝试读取数据,导致 SQLException 并将数据库回滚到我修改任何内容之前,因此我从未看到查询之间有任何区别。

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

于 2012-08-09T18:59:48.763 回答