2012-04-15 2 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/STMT/соединение.

У меня нет моего кода со мной, так что это просто с головы, игнорируйте любые синтаксические ошибки, и я надеюсь, что мой вопрос все еще достаточно ясен.

Так что мой вопрос заключается в следующем:

Если вы хотите иметь метод, который, например, выполняет запросы, и вы называете это в другом методе, а затем сделать rs.next, что является подходящим способом, чтобы закрыть ResultSet/STMT/соединение? Для меня имеет смысл закрыть их executeQuery, но это дает мне ошибку.

+1

Ну, вы выполняете запрос и закрываете 'ResultSet', но на самом деле * извлекаете *, строки результатов должны иметь открытый' ResultSet'. Таким образом, ваш единственный вариант - оставить «ResultSet» открытым после выполнения запроса, чтобы вы могли получить результаты ... После этого закройте его. Вероятно, лучше создать 1 метод, который выполняет запрос И получает результаты (если это то, что вам нужно). – Torious

ответ

2

, если вы используете ResultSet, тогда ему потребуется подключение для загрузки большего количества строк. Например, если ваш запрос возвращает 1000 записи, сначала ResultSet будет держать 41 строку в памяти, то когда вы итерацию над этим номером он будет использовать соединение, чтобы загрузить другой патрон записей .in вашего случая я хотел бы использовать RowSetfor more explanation read this

+0

Спасибо, так как бы вы предложили закрыть соединения? Только закрыть метод, вызывающий rs.next? но тогда я не могу закрыть соединение и stmt, поскольку он содержит только ссылку на rs? – Brah

+0

вы можете вернуть ArrayList вместо ResultSet, внутри вашего метода итерации по ResultSet и заполнить ArrayList записями, а затем, когда вы закончите цикл, ResultSet вернет ArrayList – confucius

1

ResultSet предназначен для обеспечения потоковой передачи результатов, например по одной записи за раз. Вот почему он не просто возвращает Collection, а скорее нечто похожее на итератор. Фактически ResultSet может лениво загружать одну запись за раз через открытое соединение JDBC.

Это считается, если вам комфортно иметь все результаты в памяти в одно и то же время - просто с нетерпением загружайте все записи перед закрытием ResultSet.

 Смежные вопросы

  • Нет связанных вопросов^_^