我正在构建一个与 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 之前。
有人知道为什么会这样吗?