Где закрыть соединение JDBC, когда я хочу вернуть ResultSet
На самом деле, вы почти ответили на этот вопрос сами. Как вы экспериментировали, закрытие Connection
высвободит связанные с ним ресурсы JDBC (по крайней мере, так должно работать). Итак, если вы хотите вернуть ResultSet
(я вернусь к этому позже), вам нужно закрыть соединение «позже». Одним из способов сделать это было бы, очевидно, передать соединение с вашим методом, что-то вроде этого:
public ResultSet executeQuery(Connection conn, String sql, String[] getValue);
Проблема в том, что я на самом деле не знаю, какова ваша конечная цель и почему вам нужны вещи такого низкого уровня, поэтому я не уверен, что это хороший совет. Если вы не пишете низкоуровневую среду JDBC (и, пожалуйста, не говорите мне, что вы этого не делаете), я бы на самом деле не рекомендовал возвращать ResultSet
. Например, если вы хотите передать какой-то бизнес-класс, вместо ResultSet
верните какой-либо объект, независимый от JDBC, или их коллекцию, как советовали другие. Также имейте в виду, что RowSet
равен a ResultSet
, поэтому, если вы не должны использовать ResultSet
, тогда вы не следует использовать RowSet
.
Лично я думаю, что вы должны использовать некоторый класс помощников вместо того, чтобы изобретать велосипед. Хотя Spring может быть излишним и иметь небольшую кривизну обучения (слишком много, если вы его совсем не знаете), Spring - не единственный путь, и я настоятельно рекомендую взглянуть на Commons DbUtils . Более конкретно, посмотрите на QueryRunner
и особенно этот query()
метод:
public <T> T query(String sql,
ResultSetHandler<T> rsh,
Object... params)
throws SQLException
Как видите, этот метод позволяет передавать ResultSetHandler
, который предоставляет метод обратного вызова для преобразования ResultSets
в другие объекты, как описано в ответе z5h , а DbUtils предоставляет несколько реализаций, просто выберите ту, которая будет соответствовать вашим потребностям. Также взгляните на служебные методы класса DbUtils
, например, различные DbUnit.close()
, которые могут оказаться полезными для закрытия ресурсов JDBC.
Действительно, если у вас нет очень веских причин для этого (и мне было бы любопытно узнать их), не пишите еще одну платформу JDBC, используйте существующее решение, это избавит вас от некоторой боли и, что более важно, , некоторые ошибки, и вы получите пользу от проверенного хорошего дизайна. Даже для вещей низкого уровня, как мы видели, существуют существующие (и простые) решения. По крайней мере, проверьте это.