在EJB中注入数据源

15
当您在应用程序中注入数据源并通过调用其上的getConnection()来获取连接时,您是否应该关闭连接?

2
是的,您需要关闭连接,这将释放连接回池中。 - dinukadev
为什么你想要使用getConnection而不是直接注入PersistenceContext? - perissf
2个回答

22

虽然数据源本身是容器管理的,但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);
        }
    }
}

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) {..}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接