在 Java EE 中隐式关闭上下文
Close context implicitly in Java EE
我正在尝试在 Java EE 8 (Java 11) 中实现以下代码以访问 Wildfly 20 中的数据源。objective 是隐式关闭 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()) {
// ...
}
我正在尝试在 Java EE 8 (Java 11) 中实现以下代码以访问 Wildfly 20 中的数据源。objective 是隐式关闭 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()) {
// ...
}