在 EJB 中注入数据源
2022-09-03 12:45:18
当您在应用程序中注入数据源并通过调用它来获取连接时,是否应该关闭该连接?getConnection()
当您在应用程序中注入数据源并通过调用它来获取连接时,是否应该关闭该连接?getConnection()
即使数据源本身是容器管理的,API确实需要程序员关闭连接。这与其他几个容器托管资源(如实体管理器)不同,后者由容器负责关闭。请注意,在大多数情况下,在此处关闭实际上不会在此处关闭连接,而是将连接返回到连接池。
根据经验,如果您使用工厂式资源从中可以关闭的一个或多个其他资源,则必须关闭它们。否则,容器将执行此操作。
由于 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);
}
}
}
当然,否则您将耗尽连接池。最好在 finally block 中执行此操作:
@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) {..}
}