几次迭代后,JDBC ResultSet在Java中关闭了

时间:2018-10-16 01:16:54

标签: java sql sqlite resultset sqlexception

我遇到一个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循环中的每次迭代中都将其关闭。

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

感谢您抽出宝贵的时间阅读本文章。

1 个答案:

答案 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并确保它已关闭。