2012-11-25 1 views
14

Wenn Sie eine Datenquelle in Ihre Anwendung injizieren und eine Verbindung durch Aufrufen von getConnection() darauf erhalten, sollen Sie die Verbindung dann schließen?Datenquelle in EJB einspeisen

+2

Ja, Sie müssen die Verbindung schließen, die die Verbindung zurück zum Pool freigeben werden. – dinukadev

+0

Warum möchten Sie getConnection verwenden und den PersistenceContext nicht direkt einfügen? – perissf

Antwort

17

Auch wenn die Datenquelle selbst Container verwaltet wird, die API in der Tat die Programmierer Verbindungen zu schließen erfordert. Dies unterscheidet sich von einigen anderen vom Container verwalteten Ressourcen (wie der Entity Manager), bei denen der Container für das Schließen zuständig ist. Beachten Sie, dass das Schließen hier in den meisten Fällen nicht tatsächlich die Verbindung hier schließt, aber die Verbindung zu einem Verbindungspool zurückgibt.

Als Faustregel gilt: Wenn Sie eine werksseitige Ressource verwenden, um eine oder mehrere andere Ressourcen zu erhalten, die geschlossen werden können, müssen Sie sie schließen. Ansonsten tut der Container das.

Seit Connection implementiert AutoCloseable, können Sie einen Try-mit-Ressourcen-Block für diesen Einsatz:

@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

Natürlich, sonst werden Sie Ihren Verbindungspool erschöpfen. Es ist am besten, dies in finally-Block zu tun:

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