Java, AutoCloseable: Должен ли ресурс освобождать родительский ресурс?

Сразу приведу свой пример. У меня имеется пул соединений с базой данных от библиотеки hikaricp:

HikariDataSource dataSource = new HikariDataSource(...);      
// работа с dataSource
dataSource.close();

В данном случае dataSource - это ресурс, который надо освобождать с помощью метода close.

Но мне не нравится стандартный jdbc и я сделал обертку для него:

HikariDataSource dataSource = new HikariDataSource(...);
JDBCWrapper jdbcWrapper = new JDBCWrapper(dataSource);
// работа с wrapper
wrapper.close();
dataSource.close();

Класс JDBCWrapper это обертка для работы с jdbc. Но внутри себя она создает собственные ресурсы, например, пул потоков для асинхронных запросов, по этому эта оберка тоже является ресурсом и имеет метод close для их освобождения.

Вопрос: должна ли обертка JDBCWrapper при вызове ее метода close так же освобождать dataSource?

С одной стороны dataSource находится внутри обертки JDBCWrapper и тоже должен освободиться, а с другой стороны этот ресурс с точки зрения обертки был получен "извне", откуда обертке знать, возможно, этот ресурс еще кому-то нужен там извне.

Если что, я не ищу инструмент для работы с базой данных, я хочу разобрать именно этот пример.


Ответы (1 шт):

Автор решения: Aziz Umarov

Все хорошо, что хорошо кончается (Уильям Шекспир)

Система как я уже упомянул, такая

Если вы создаёте объект, то позаботесь о его успешной утилизации (убрать ненужные ссылки, для упешной работы GC). Если же объект получает через Dependancy Injection то будьте добры работать с ним и вернуть в исходном как-бы состоянии.

Вот в таком варианте да

HikariDataSource dataSource = new HikariDataSource(...);
JDBCWrapper jdbcWrapper = new JDBCWrapper(dataSource);
// работа с wrapper
wrapper.close();
dataSource.close();

В таком варианте нет

JDBCWrapper jdbcWrapper = new JDBCWrapper(new HikariDataSource(...));
// работа с wrapper
wrapper.close();

PS. Мнение личное прошу не холиварить

→ Ссылка