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

Posted

技术标签:

【中文标题】Java JDBC 从不同的调用返回重复的结果集【英文标题】:Java JDBC returning duplicate result set from different calls 【发布时间】:2012-08-09 16:52:40 【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

如果您从您的应用中发布一些相关代码会有所帮助。 那些静态方法会使用任何可变数据吗? 是的,数据是可变的,但在要验证和插入的 cal 之间的数据中没有任何改变。 在你完成后尝试关闭()结果集。 “应用程序崩溃”是什么意思。你有堆栈跟踪吗?如果是这样,请编辑您的帖子并添加 complete 堆栈跟踪。如果不是,请解释您的意思并显示您收到的任何错误消息。 【参考方案1】:

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

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

【讨论】:

以上是关于Java JDBC 从不同的调用返回重复的结果集的主要内容,如果未能解决你的问题,请参考以下文章

从 JDBC、Java 调用 Sqlserver 存储过程

3JDBC-API

Java -- JDBC 学习--通过 ResultSet 执行查询操作

使用JDBC从Java调用Oracle SQL中的存储过程的示例

使用JDBC从数据库中查询数据

从 Java JDBC 调用 oracle 函数