我有一个表在我的数据库中,它拥有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"异常关闭ResultSet。在org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkClosed (AbstractJdbc2ResultSet.java: 2654)org.postgresql.jdbc2.AbstractJdbc2ResultSet.next (AbstractJdbc2ResultSet.java: 1786)
你能帮我找出问题是什么吗?
Javadoc for jdbc语句说
默认情况下,每个Statement对象只能同时打开一个ResultSet对象。
所以我的猜测是你试图在同一时间为同一个PreparedStatement打开太多的结果集。
编辑:Postgres jdbc driver doc似乎证实了这一点:
你可以任意多次使用一个Statement实例。您可以在打开连接后立即创建一个,并在连接的生命周期内使用它。但是您必须记住,在给定的时间内,每个Statement或PreparedStatement只能存在一个ResultSet。
据我所知,您正在使用ResultSet对象来存储语句结果,然后将其作为参数传递给递归函数调用。所以基本上你重写了变量,失去了对它的引用。您应该编写sql语句来检索您需要的数据,或者不将相同的ResultSet对象传递给递归调用。