2012-04-15 37 views
1
try{ 
     String query= "select user_name from user"; 
     ResultSet rs = queries.performQuery(query); 

while(rs.next()){ 
     System.out.println("User Name :" + rs.getString("user_name")); 
     } 
另一类

我有这样的事情:调用另一种方法获取结果集并正确关闭连接?

public ResultSet performQuery(String query) throws SQLException 
    {  
     try 
     { 
       connection = DriverManager.getConnection(sqlUrl,sqlUser,sqlPassword); 
       stmt = connection.createStatement(); 
        rs = stmt.executeQuery(query); 
     } 

     catch(SQLException ex) 
     { 
     } 

     finally{ 
      close(rs); 
      close(stmt); 
      close(connection); 
     } 
     return rs; 
    } 

现在我得到的错误不允许操作的ResultSet关闭后,这是明显的,因为我关闭RS /语句/连接。

我没有我的代码,所以这只是我的头顶,忽略任何语法错误,我希望我的问题仍然清楚。

所以我的问题是这样的:

如果你想有一个例如执行查询的方法,并调用在另一种方法,然后做rs.next,什么是适当的方式来关闭ResultSet /语句/连接?对我来说关闭performQuery是有意义的,但是这给了我错误。

+1

那么,你执行一个查询并关闭ResultSet,但实际上*检索结果行需要一个打开的ResultSet。因此,您唯一的选择是在执行查询后保持“ResultSet”处于打开状态,以便检索结果...之后,关闭它。创建1个方法可能会更好,这两个方法都会执行查询并检索结果(如果这就是您之后的结果)。 – Torious 2012-04-15 18:54:41

回答

2

如果您使用的是ResultSet那么它将需要连接来加载更多的行。例如,如果您的查询返回1000条记录,第一个结果集将持有41排在内存中,然后当你遍历这个数字,你会使用连接到负载。在你的情况下记录另一盘我会用RowSetfor more explanation read this

+0

谢谢,那么你会如何建议关闭连接?只能在调用rs.next的方法中关闭?但然后我不能关闭连接和stmt,因为它只包含rs的引用? – Brah 2012-04-15 19:14:12

+0

您可以返回一个ArrayList而不是ResultSet,在您的方法内迭代ResultSet并用记录填充ArrayList,然后当您完成循环ResultSet时返回ArrayList – confucius 2012-04-15 19:17:03

1

ResultSet旨在允许流式传输结果,例如一次一个记录。这就是为什么它不是简单地返回某种类型的Collection,而是类似于迭代器。实际上,ResultSet可以通过打开的JDBC连接一次性懒惰地加载一条记录。

这就是说,如果你对在同一时间在内存中的所有结果感到满意 - 只是在关闭ResultSet之前急切地加载所有记录。

相关问题