首页 > 解决方案 > 经过几次迭代后,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循环中的每次迭代都关闭它。

如果需要更多代码或解释,请告诉我,我会尽力提供帮助。

感谢您抽出时间来阅读。

标签: javasqlsqliteresultsetsqlexception

解决方案


因此,经过更多的谷歌搜索并在这里睡觉,这对我有用。

中的搜索功能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并确保它已关闭。


推荐阅读