我遇到一个ResultSet
被关闭的问题。令我感到困惑的是,它适用于部分数据,然后关闭。起初我以为可能是因为连接超时,但事实并非如此。
程序的这一部分涉及将.xlsx
工作簿与已经存在的SQL
数据库进行比较,并且缺少更好的术语来合并/更新它。
首先,在我的CompareDatabase
类中,我调用一个搜索函数,该函数每6次迭代在SQLite
数据库中搜索特定的字符串。
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
类中搜索该值并返回一个String(最初是Boolean,但我想查看输出)。
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
循环中的每次迭代中都将其关闭。
如果需要更多代码或解释,请告诉我,我会尽力提供帮助。
感谢您抽出宝贵的时间阅读本文章。
答案 0 :(得分:0)
因此,经过更多谷歌搜索和睡眠之后,这才对我有用。
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
并确保它已关闭。