Mysql SQLException,ResultSet已关闭,但我可以找出原因

Mysql SQLException,ResultSet已关闭,但我可以找出原因,mysql,prepared-statement,resultset,sqlexception,Mysql,Prepared Statement,Resultset,Sqlexception,我的java.sql.ResultSet有问题,我有一个java.sql.PreparedStatement,在它上运行executeQuery()返回一个ResultSet,但当我尝试从查询中获取结果时,却引发了一个异常: 异常:java.sql.SQLException消息:之后不允许操作 结果集关闭 通过在线搜索,结果集可能会因为以下几个原因而关闭: 生成它的PreparedStatement对象已关闭 重新执行生成它的PreparedStatement对象 生成它的PreparedSta

我的java.sql.ResultSet有问题,我有一个java.sql.PreparedStatement,在它上运行executeQuery()返回一个ResultSet,但当我尝试从查询中获取结果时,却引发了一个异常:

异常:java.sql.SQLException消息:之后不允许操作 结果集关闭

通过在线搜索,结果集可能会因为以下几个原因而关闭:

  • 生成它的PreparedStatement对象已关闭
  • 重新执行生成它的PreparedStatement对象
  • 生成它的PreparedStatement对象用于从多个结果序列中检索下一个结果
  • 正在关闭用于生成PreparedStatement的连接
  • 我检查了我的代码,没有做这些事情。下面是导致问题的代码片段:

    PreparedStatement psAccountPartyIdByEmail = null;
    ....
    try {
        String [] nextLine;
        while ((nextLine = reader.readNext()) != null) {
            String email = nextLine[0];
            .....
            try {
                if (psAccountPartyIdByEmail == null) {
                    psAccountPartyIdByEmail = session.connection().prepareStatement(SQL_GET_ACCOUNTPARTYID_BY_EMAILADDRESS);
                }
    
                psAccountPartyIdByEmail.setString(1, email);
                ResultSet partyIds = psAccountPartyIdByEmail.executeQuery();
    
                while (partyIds.next()) {
                   String partyId = partyIds.getString(1);
                    .....
                }
            } catch (SQLException e) {
                Debug.logError(e, "Encountered SQLException while running group service.", MODULE);
            }
        }
    } catch (IOException e) {
        Debug.logError(e, "Problem reading line in file", MODULE);
    }
    
    尝试执行时引发异常:
    while(partyIds.next()){

    正如我所说,我从不关闭连接或语句,正如您所看到的,在尝试查看结果之前,我不会重用该语句

    谢谢你的帮助


    Marc

    我不知道这是否能解决这个问题,但你可以/应该搬家

    if (psAccountPartyIdByEmail == null) {
                psAccountPartyIdByEmail = session.connection().prepareStatement(SQL_GET_ACCOUNTPARTYID_BY_EMAILADDRESS);
            }
    
    在while循环之外。 另外,在处理完行后关闭结果集。
    然后,当您完成所有操作后,关闭您的语句和连接。

    我尝试了您的两个建议,但都没有效果。出于好奇,为什么您要将上述代码移出循环,为什么您认为这会产生影响。我希望关闭ResultSet会奏效。至于移动PS创建,没有理由继续在循环中检查它;除非可能没有reader.nextLine(),在这种情况下,将毫无理由地创建PS。您使用的是什么数据库和驱动程序?com.mysql.jdbc.driver和mySQLTo更具体地说是mysql-connector-java-5.1.13和mysql 5.5