Должен ли я закрыть соединение JdbcTemplate и вручную созданные операторы?

Для большинства моих запросов я использую метод query() из JdbcTemplate и RowMapper, который будет выполнять все операторы и соединения внутри.

Но в конкретном случае мне нужны дополнительные метаданные из ResultSet, и я просто хочу сам обрабатывать Statement и ResultSet.

Должен ли я после этого закрыть Statement или Connection, чтобы он был возвращен в пул соединений, или это делается Spring, даже если я не использую методы JdbcTemplate?

    Connection conn = getJdbcTemplate().getDataSource().getConnection();
    PreparedStatement ps = conn.prepareStatement(sql);
    ResultSet rs = ps.executeQuery();

    /* ... */

    ps.close();    // should I do this?
    conn.close();  // and this?

person das Keks    schedule 16.02.2017    source источник
comment
Если вы сами возитесь с соединением, да, вы должны закрыть его. Или лучше используйте ConnectionCallback или один из других интерфейсов обратного вызова. Зачем вам нужно вручную получать соединение? Я не обнаружил необходимости (или необходимости) делать это при использовании JdbcTemplate.   -  person M. Deinum    schedule 16.02.2017
comment
Чтобы легко генерировать некоторые отчеты, я просто хочу вывести весь результат запроса в объект, который состоит из массива заголовков с именами столбцов и двумерного массива строк/столбцов для значений. Я хочу использовать один и тот же метод для разных операторов, поэтому мне нужно получить имена заголовков из ResultSet.   -  person das Keks    schedule 16.02.2017
comment
Именно в этом вам поможет ResultSetExtractor.   -  person M. Deinum    schedule 16.02.2017
comment
если вы вручную обрабатываете соединение, набор результатов и т. д., вам не следует использовать jdbctemplate в первую очередь. Смысл шаблона в том, чтобы обрабатывать их за вас. Тем не менее, вы не должны отказываться от шаблона, а использовать методы, которые он предоставляет.   -  person eis    schedule 16.02.2017


Ответы (1)


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

person thopaw    schedule 16.02.2017
comment
Думаю, я тоже воспользуюсь методом DataSourceUtils.releaseConnection() :) - person das Keks; 16.02.2017