java - 经过几次迭代后,JDBC ResultSet 在 Java 中关闭
问题描述
我在ResultSet
关闭时遇到问题。让我困惑的是它适用于部分数据然后关闭。起初我认为这可能是因为连接超时,但似乎并非如此。
该程序的这一部分涉及将.xlsx
工作簿与已经存在的SQL
数据库进行比较,并且由于缺乏更好的术语来合并/更新它。
首先,在我的CompareDatabase
课堂上,我调用了一个搜索函数,该函数SQLite
每 6 次迭代在数据库中搜索特定字符串。
int columnCount = 6;
dataPoint = dataPoint.replaceAll("Detail", "");
String[] temp = dataPoint.trim().split("\\s+");
System.out.println(Arrays.toString(temp));
for (String tempDataPoint : temp) {
if ( columnCount == 6) {
System.out.println(search(tempDataPoint, connection));
}
columnCount = 0;
} else {
columnCount++;
}
}
这个搜索函数(也CompareDatabase
应该在类中搜索值并返回一个字符串(最初是一个布尔值,但我想查看输出)。
private String search (String searchValue, Connection connection) throws SQLException {
PreparedStatement pStatement = null;
pStatement = connection.prepareStatement("SELECT * FROM lotdatabase where (Vehicle) = (?)");
pStatement.setString(1, searchValue);
try (ResultSet resultSet = pStatement.executeQuery()){
return resultSet.getString(1);
}finally {
close(pStatement);
}
}
最后,您可以看到PreparedStatement
已关闭。也应该自动关闭(我在ResultSet
某处读过),但 JDBC 可能不可靠。
然而Connection
,它仍然是开放的,因为它将搜索大约 200 多个字符串并且多次打开和关闭似乎不是一个好主意。
这些函数由我的main
班级在这里调用:一个被注释掉,因为它会因为主键违规而出错。
public static void main(String[] args) {
SQLDatabase sqlDatabase = new SQLDatabase();
//sqlDatabase.convertToSQL("Database1.xlsx");
sqlDatabase.compare("Database2.xlsx");
}
我怀疑我正在处理一堆这样的错误(在管理连接方面),我希望能参考我可以学习正确做的地方。
此外,因为它PreparedStatement
只能处理一个ResultSet
我不认为这是我的问题,因为我在for
循环中的每次迭代都关闭它。
如果需要更多代码或解释,请告诉我,我会尽力提供帮助。
感谢您抽出时间来阅读。
解决方案
因此,经过更多的谷歌搜索并在这里睡觉,这对我有用。
中的搜索功能compareDatabase
更改为:
private Boolean search (String searchValue, Connection connection) {
PreparedStatement ps = null;
try {
ps = connection.prepareStatement("SELECT * FROM lotdatabase where " +
"(Vehicle) = (?)");
ps.setString(1, searchValue);
ResultSet resultSet = ps.executeQuery();
//The following if statement checks if the ResultSet is empty.
if (!resultSet.next()){
resultSet.close();
ps.close();
return false;
}else{
resultSet.close();
ps.close();
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
在另一个函数中,compareDatabase
我这样调用search
函数:
if (search(tempDataPoint, connection)) {
System.out.println("MATCH FOUND: " + tempDataPoint);
}else {
System.out.println("NOT FOUND: " + tempDataPoint);
}
这使我可以检查ResultSet
并确保它已关闭。
推荐阅读
- windows - 为 Windows 上的所有登录用户重新启动 explorer.exe 进程以强制执行 SRP 规则
- ibm-midrange - iSeries/AS400 渐进式部署
- javascript - date-fns 和 react - while 循环在检查给定的 if 语句条件后增加了 1 天
- command-line - 如何在 ls 命令的 cshell 别名中使用星号?
- javascript - 如何将数组方法(反向和连接)应用于此字符串
- php - 如何使用 Timber 在页脚中显示 3 个最近的帖子?
- python-3.x - python-3x 中的相对导入
- sas - SAS中的Proc转置,var变量中有多个观察值
- c# - 使用 lastwritetime 从 FTP 复制文件
- android - 每次创建 Fragment 时,来自 Dao 的 LiveData 都会触发 onChanged