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 が閉じられた後に Operation not allowed というエラーが表示されます。これは明らかに、rs/stmt/connection を閉じているためです。

私は自分のコードを持っていないので、これは私の頭の上にあるだけで、構文エラーは無視してください。私の質問がまだ十分に明確であることを願っています。

だから私の質問はこれです:

たとえば、クエリを実行するメソッドが必要で、それを別のメソッドで呼び出してから rs.next を実行する場合、結果セット/stmt/接続を閉じる適切な方法は何ですか? 私にとっては、performQuery を閉じることは理にかなっていますが、エラーが発生します。

4

2 に答える 2

2

を使用している場合はResultSet、さらに行をロードするために接続が必要になります。たとえば、クエリが1000レコードを返す場合、最初にResultSetはメモリに41行を保持し、次にこの数を繰り返すと、接続を使用してレコードの別のチャックをロードします。あなたの場合RowSet 、詳細についてはこれを読んでください。

于 2012-04-15T18:58:04.337 に答える
1

ResultSet一度に1つのレコードなど、結果のストリーミングを可能にするように設計されています。そのため、単にCollection何らかのものを返すのではなく、イテレータに似たものを返します。実際ResultSet、開いているJDBC接続を介して一度に1つのレコードを遅延ロードできます。

つまり、すべての結果を同時にメモリに保存することに慣れている場合は、閉じる前にすべてのレコードを熱心にロードするだけResultSetです。

于 2012-04-15T18:58:41.887 に答える