gpt4 book ai didi

java - 结果集已关闭

转载 作者:行者123 更新时间:2023-11-30 11:15:34 25 4
gpt4 key购买 nike

以下是我的表定义:

create Table alarms(
alarmId int primary key identity(1,1),
alarmDate varchar(50) not null,
alarmText varchar(50) not null,
alarmStatus varchar(10) Check (alarmStatus in(-1, 0, 1)) Default 0
);

其次,这是我正在使用的一些方法:

public void restartDatabase(){
try{
Class.forName(Settings.getDatabaseDriver());
connection = DriverManager.getConnection( Settings.getJdbcUrl() );
statement = connection.createStatement();
}
catch(Exception e){
e.printStackTrace();
}
}


public ResultSet executeQuery(String query){
ResultSet result = null;
try {
result = statement.executeQuery(query);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}

public void closeDatabase() {
try {
if ((statement != null) && (connection != null)) {
statement.close();
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}

我想做的是从日期等于给定日期的表中获取所有 alarmId,然后针对每个 alarmId,我想将其状态更新为给定状态:

public static void updateAlarmStatus(int status) {
ResultSet rs = null;
database.restartDatabase();
try {
rs = database
.executeQuery("Select alarmId from alarms where alarmDate = '"
+ Alarm.getFormattedDateTime(DateFormat.FULL,
DateFormat.SHORT) + "'");
while (rs.next()) {
database.executeUpdate("update alarms set alarmStatus = '"+status+"' where alarmId = '"+rs.getString("alarmId")+"'");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
database.closeDatabase();
}
}

但它会生成结果集已关闭的错误。我用 Goggled 它发现当我们尝试在其中执行另一个查询时,结果集会自动关闭它需要重新启动连接。我尝试调用正在创建新连接但仍然出现相同错误的 restartDatabase() 方法。

最佳答案

我猜 executeUpdate 对其 Statement 使用与查询所用相同的实例变量。当您创建一个新的 Statement 并将其分配给变量时,没有任何内容引用旧的,因此它被切断并成为垃圾收集的对象。在垃圾回收期间,语句的终结器被调用,将其关闭。关闭该语句会使它创建的 ResultSet 也关闭。

您不应该在不同的查询和更新之间共享这些语句变量。该语句应该是局部变量而不是对象实例的成员。

此外,结果集应始终是局部变量,不应将它们传递到创建它们的方法之外。 resultSet 是对游标的引用,它实际上不包含任何数据。总是让你的代码从结果集中读取并用结果填充一些数据结构,然后返回数据结构。

关于java - 结果集已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25351891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com