经过多次迭代后,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);
}