2012-11-25 34 views
14

Quando si inietta un'origine dati nell'applicazione e si ottiene una connessione invocando getConnection() su di essa, si suppone che si chiuda la connessione?Iniezione origine dati in EJB

+2

Sì è necessario chiudere la connessione che rilascerà la connessione torna alla piscina. – dinukadev

+0

Perché si desidera utilizzare getConnection e non iniettare direttamente PersistenceContext? – perissf

risposta

17

Anche se l'origine dati è di per sé il contenitore gestito, l'API richiede infatti al programmatore di chiudere le connessioni. Questo è diverso da un paio di altre risorse gestite dal contenitore (come il gestore di entità), in cui il contenitore si occupa della chiusura. Si noti che la chiusura qui nella maggior parte dei casi non in realtà chiude la connessione qui, ma restituisce la connessione a un pool di connessioni.

Come regola generale, se si utilizzano le risorse di fabbrica per ottenere una o più risorse da quelle che possono essere chiuse, è necessario chiuderle. Altrimenti il ​​contenitore fa questo.

Dal Connection attrezzi AutoCloseable, è possibile utilizzare un blocco try-with-risorse per questo:

@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

Ovviamente, altrimenti si esaurirà il pool di connessione. E 'meglio farlo in blocco 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) {..} 
} 
Problemi correlati