Закрытие соединения с базой данных в Java - PullRequest
1 голос
/ 24 октября 2011

У меня есть следующий метод в моем классе базы данных, который возвращает набор результатов для данного оператора SQL:

public static ResultSet sqlStatement(String query) throws SQLException{
    ResultSet result = null; 
    Connection conn = connect();
    Statement newStatement = conn.createStatement(); 
    result = newStatement.executeQuery(query);
    conn.close();
    return result;
}

Я хочу закрыть соединение с базой данных, прежде чем я верну набор результатов, но он выдает следующееисключение:

java.sql.SQLException: out of memory

Я ява-нуб и экспериментирую, поэтому любая помощь очень ценится.

Ответы [ 4 ]

1 голос
/ 24 октября 2011

В моем прошлом опыте (без документа или чего-либо еще) я бы понимал «ResultSet» как указатель на C. Бьюсь об заклад, он будет кэшировать некоторые строки из базы данных при выполнении вашего запроса ..

Поэтому, если вы закроете соединение, а затем попытаетесь использовать набор результатов, все эти кэшированные наборы результатов не будут иметь правильной информации и не получат следующий кэш и т. Д. В результате это приведет к исключению из памяти.

В любом случае правильный способ использовать те, в Java ..

Connection con...
try{
    create connection
    execute query
    use your resultset completely..
}catch(...){
}finally{
    close connection;
}

Надеюсь, это поможет

1 голос
/ 24 октября 2011

Поместите conn.close() в блок finally, чтобы он получал событие выполнения, если выброшено исключение.

0 голосов
/ 24 октября 2011

Помимо закрытия ресурсов в блоке finally, вы также должны закрыть свои PreparedStatement и ResultSet. На самом деле, вы не должны возвращать ResultSet и держать его открытым слишком долго. Вместо этого вы можете прочитать его в какое-то промежуточное хранилище данных, такое как List<Object[]>.

С другой стороны, вы не получаете java.lang.OutOfMemoryError, поэтому, возможно, самой вашей базе данных не хватило памяти

0 голосов
/ 24 октября 2011

всегда, всегда, всегда закрывайте ресурсы базы данных в блоке finally!

Я сомневаюсь, что ваша логика будет работать как есть.ResultSet доступен только при открытом соединении.вам нужно обработать весь ResultSet до того, как вы закроете соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...