Инъекционный источник данных в EJB

Когда вы вводите источник данных в приложение и получаете соединение, вызывая getConnection() на нем, вы должны закрыть соединение?

Ответы

Ответ 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);
        }
    }
}

Ответ 2

Конечно, иначе вы исчерпаете свой пул соединений. Лучше всего сделать это в конце блока:

@Resource(mappedName="jndi/yourDatasource")
DataSource ds;

..

Connection conn = null;
try {
     conn = ds.getConnection();
     //PERFORM QUERY, ETC..
}
catch(SQLException ex) {
     //EXCEPTION HANDLING
}
finally {
    try {
        if(conn != null)
            conn.close();
    }
    catch(SQLException ex) {..}
}