在EJB中注入数据源

Luc*_*uke 15 java ejb java-ee

当您在应用程序中注入数据源并通过调用getConnection()它获得连接时,您是否应该关闭连接?

Arj*_*jms 21

即使数据源本身是容器管理的,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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Mil*_*kic 5

当然,否则你将耗尽你的连接池.最好在finally块中执行此操作:

@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) {..}
}
Run Code Online (Sandbox Code Playgroud)