Ответ 1
Даже несмотря на то, что сам источник данных управляется контейнером, API действительно требует, чтобы программист закрывал соединения. Это отличается от нескольких других управляемых контейнером ресурсов (например, диспетчера сущностей), где контейнер заботится о закрытии. Обратите внимание, что закрытие здесь в большинстве случаев фактически не закрывает соединение здесь, а возвращает соединение с пулом соединений.
Как правило, если вы используете ресурсы factory -ish для получения одного или нескольких других ресурсов, которые могут быть закрыты, вы должны их закрыть. В противном случае контейнер делает это.
Так как Connection реализует AutoCloseable, вы можете использовать блок try-with-resources для этого:
@Stateless
public class MyBean {
@Resource(lookup = "java:/app/datasource")
private DataSource dataSource;
public void doStuff() {
try (Connection connection = dataSource.getConnection()) {
// Work with connection here
} catch (SQLException e) {
throw new SomeRuntimeException(e);
}
}
}