在 Java EE 中隐式关闭上下文

问题描述

我正在尝试在 Java EE 8 (Java 11) 中实现以下代码以访问 Wildfly 20 中的数据源。目标是隐式关闭 JNDI 上下文和 sql 连接:

try (InitialContext context = new InitialContext();
     Connection conn = ((DataSource) context.lookup(pool)).getConnection()) {
    
      // use the connection

} 
catch (NamingException e) {
    logger.error(e.getMessage());
} 
catch (sqlException e) {
    logger.error(e.getMessage());
}

问题是上下文不可关闭,因为我收到编译错误

The resource type InitialContext does not implement java.lang.AutoCloseable

我试图避免添加 finally关闭上下文,有没有办法实现这一点?

解决方法

Try-with-resources 仅适用于 AutoCloseable 的对象。在不使用 finally 的情况下执行此操作的一种方法是将 InitialContext 包装在实现 AutoCloseable 的包装器中,该包装器在其 close() 方法中执行必要的操作。像这样:

public class AutoCloseableWrapper implements AutoCloseable {

    private final InitialContext context;

    public AutoCloseableWrapper(InitialContext context) {
        this.context = context;
    }

    public InitialContext getContext() {
        return this.context;
    }

    @Override
    public void close() throws Exception {
        this.context.close();
    }
}

像这样使用它:

try (AutoCloseableWrapper wrapper = new AutoCloseableWrapper(new InitialContext());
     Connection conn = ((DataSource) wrapper.getContext().lookup(pool)).getConnection()) {

    // ...
}