使用postgresql的Java ResultSet

时间:2011-12-12 16:56:11

标签: java sql postgresql jdbc resultset

我的数据库中有一个表格,其中包含2列:uid1 - 某人的id,uid2 - 他的朋友。

我想创建一个列表,其中我是某人的朋友 - 直到5深度连接。

所以我构建了以下递归方法:

    private void recursive(int theUid,ResultSet rs,ArrayList<Integer> friends,int count,int next,PreparedStatement pstmt) throws SQLException{
        if(count>=1 && next==theUid){
            return;
        }
        else if(count>=DEPTH_OF_CONNECTION){
            return;
        }

        else{
            pstmt.setInt(1,next);
            rs=pstmt.executeQuery();
            count++;
            while(rs.next()) {
                friends.add(rs.getInt(1));
                recursive(theUid,rs,friends,count,rs.getInt(1),pstmt);
            }
        }
    }
}

我收到以下错误:

  

线程“main”中的异常org.postgresql.util.PSQLException:这个   ResultSet已关闭。在   org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkClosed(AbstractJdbc2ResultSet.java:2654)at at   org.postgresql.jdbc2.AbstractJdbc2ResultSet.next(AbstractJdbc2ResultSet.java:1786)

你能帮我找出问题所在吗?

2 个答案:

答案 0 :(得分:9)

Javadoc对于jdbc语句说

  

默认情况下,每个Statement对象只能同时打开一个ResultSet对象。

所以我的猜测是你试图同时为同一个PreparedStatement打开太多的结果集。

编辑:

Postgres jdbc driver doc似乎证实了这一点:

  

您可以根据需要多次使用一个Statement实例。您可以在打开连接后立即创建一个连接,并将其用于连接的生命周期。但是你必须记住,在给定时间,每个Statement或PreparedStatement只能存在一个ResultSet。

答案 1 :(得分:1)

据我所知,您正在使用ResultSet对象来存储语句结果,然后将其作为参数传递给递归函数调用。所以基本上你要覆盖变量并丢失对它的引用。您应该编写sql语句来检索所需的数据,或者不将相同的ResultSet对象传递给递归调用。