Где закрыть соединение JDBC, пока я хочу вернуть ResultSet
Собственно, вы почти сами и ответили на этот вопрос. Как вы уже экспериментировали, закрытие Connection
освободить связанные с ним ресурсы JDBC (по крайней мере, так все должно работать). Итак, если вы хотите вернуть ResultSet
(я вернусь к этому позже), вам нужно закрыть соединение «позже». Один из способов сделать это, очевидно, состоит в том, чтобы передать соединение с вашим методом, что-то вроде этого:
public ResultSet executeQuery(Connection conn, String sql, String[] getValue);
Проблема в том, что я на самом деле не знаю, какова ваша конечная цель и почему вам нужны вещи такого низкого уровня, поэтому я не уверен, что это хороший совет. Если вы не пишете структуру JDBC низкого уровня (и, пожалуйста, не говорите мне, что вы этого не делаете), я бы на самом деле не рекомендовал возвращать ResultSet
. Например, если вы хотите накормить какой-то бизнес-класс, верните какой-нибудь независимый от JDBC объект или их набор, как рекомендовали другие, вместо ResultSet
. Также имейте в виду, что RowSet
< strong>является 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
< /a>, например различные DbUnit.close()
, которые могут оказаться удобными для закрытия ресурсов JDBC.
На самом деле, если у вас нет очень веских причин для этого (а мне было бы любопытно их узнать), не пишите еще одну JDBC-инфраструктуру, используйте существующее решение, это избавит вас от некоторых проблем и, что более важно, от некоторых ошибок. и вы выиграете от проверенного хорошего дизайна. Как мы видели, даже для вещей низкого уровня существуют (и простые) решения. По крайней мере, проверьте это.
person
Pascal Thivent
schedule
16.12.2009