经过多次迭代后,JDBC结果集在Java中关闭
我在关闭经过多次迭代后,JDBC结果集在Java中关闭,java,sql,sqlite,resultset,sqlexception,Java,Sql,Sqlite,Resultset,Sqlexception,我在关闭ResultSet时遇到问题。让我困惑的是,它对一部分数据起作用,然后关闭。起初我认为这可能是因为连接超时,但事实似乎并非如此 该程序的这一部分涉及将.xlsx工作簿与已存在的SQL数据库进行比较,并在缺少更好术语的情况下对其进行合并/更新 首先,在我的CompareDatabase类中,我调用了一个搜索函数,该函数每6次迭代就在SQLite数据库中搜索一个特定的字符串 int columnCount = 6; dataPoint = dataPoint.replaceAll("Deta
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
类中)应该搜索值并返回字符串(最初是一个布尔值,但我想查看输出)
最后,您可以看到PreparedStatement
已关闭。ResultSet
也应自动关闭(我在某处读到),但JDBC可能不可靠
然而,连接仍处于打开状态,因为它将搜索大约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
并确保它已关闭。关闭(pStatement)
做什么?它调用关闭函数,其本身基本上就是pStatement.close()
但它只是让它看起来更漂亮一点,因为我关闭了许多语句和所有语句。您使用的是try with resources
,所以您不应该关闭自己的。尽管如此,之前;即使没有try with resources
它也会在我尝试在结果集中使用if
逻辑时关闭。是否有pRoPER的方法是这样做的?不知道StActTrace的异常是什么样子,我只能猜测。考虑使用连接的DCP并每次关闭它。
if (search(tempDataPoint, connection)) {
System.out.println("MATCH FOUND: " + tempDataPoint);
}else {
System.out.println("NOT FOUND: " + tempDataPoint);
}