【发布时间】: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 堆栈跟踪。如果不是,请解释您的意思并显示您收到的任何错误消息。