当您在应用程序中注入数据源并通过调用其上的
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);
}
}
}
@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) {..}
}