Можно ли построить адаптер JCA, где соединения автоматически закрываются? - PullRequest
1 голос
/ 04 января 2012

Я создаю адаптер JCA с пользовательским классом 'connection'. Во всех примерах, которые я видел, вы должны поместить void close () в ваш класс соединения. Затем, при использовании вашего пользовательского класса соединения, вы должны поместить вызов close () в блок finally.

Я не очень доверяю разработчикам, чтобы они помнили закрывать в блоке finally. Кроме того, мне не нужно вызывать «close ()» в EntityManager. Контейнер управляет открытием и закрытием EntityManager автоматически.

Есть ли способ заставить контейнер автоматически закрывать любые соединения с моим адаптером JCA? Я попытался переопределить finalize (), но может пройти очень много времени, прежде чем JVM решит очистить мои соединения.

Или, если бы кто-то знал, как написать плагин для findbugs для идентификации везде, где пользовательский класс соединения использовался без close () в блоке finally ... Я бы, наверное, согласился.

1 Ответ

1 голос
/ 04 января 2012

Если вы знаете свой рабочий процесс, у вас может быть фоновый поток, отслеживающий активность ваших соединений и закрывающий что-либо через определенное время (10 с, 30 с, 2 часа и т. Д.).

Вы также можете переопределитьметод финализации, как вы упомянули.Это пригодно для использования, просто не гарантировано.Но на любом достаточно загруженном сервере вы, вероятно, получите достаточно активности GC, чтобы он вовремя закрывал большинство ваших соединений.Предостережение о том, что с финализацией нет гарантии, - это просто принять, что если кто-то убьет процесс (или он неисправен, или что-то еще), ваш финализатор не будет вызван.

Наконец, это простой захват, когда соединение создаетсяпросто создав новое исключение и заполнив его трассировку стека.Держите это исключение вместе с открытым соединением, и когда вы обнаружите, что вы «вынуждены» закрыть его (через время, завершить или что-то еще), вы можете просто выгрузить исключение в свой журнал, чтобы найти оскорбительную «открытую» строку длясоединение.

Вы должны подключиться к жизненному циклу JCA для случая, когда соединитель разрушен или не развернут (например, когда модуль удален с сервера или сервер выключен).Это может сказать вам, какие соединения были оставлены открытыми, модуль был удален.

...