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 шт):
Все хорошо, что хорошо кончается (Уильям Шекспир)
Система как я уже упомянул, такая
Если вы создаёте объект, то позаботесь о его успешной утилизации (убрать ненужные ссылки, для упешной работы 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. Мнение личное прошу не холиварить