2013-05-07 22 views
7

In riferimento a Tomcat JBDC connection pool, vedo nell'esempio java standalone fornito in questo caso, si ottiene la connessione utilizzando datasource.getConnection() che è interessante. Ma nel blocco finale, dice con.close().Pool di connessione Tomcat JDBC (connessione in uscita)

Domanda: Quando eseguo questa operazione, sembra ovvio che lo con che ottengo dall'origine dati verrà chiuso ogni volta nell'ultimo. Quando questo è chiuso, il meccanismo di pooling delle connessioni acquisirà una nuova connessione e lo aggiungerà al pool?

Suppongo che ci debba essere una chiamata al metodo come releaseConnection() che consentirà al pool di decidere autonomamente se chiuderlo o lasciarlo aperto per qualche altro uso.

Ho anche provato a fare questo ConnectionPool aPool = datasource.createPool(); Ma vedo che non c'è niente come connessione di rilascio su questo aPool.

Penso che mi manchi qualcosa qui? Apprezzo il tuo aiuto.

Codice frammento dal Tomcat JBDC connection pool:

  DataSource datasource = new DataSource(); 
      datasource.setPoolProperties(p); 

      Connection con = null; 
      try { 
       con = datasource.getConnection(); 
       Statement st = con.createStatement(); 
       ResultSet rs = st.executeQuery("select * from user"); 
       int cnt = 1; 
       while (rs.next()) { 
        System.out.println((cnt++)+". Host:" +rs.getString("Host")+ 
        " User:"+rs.getString("User")+" Password:"+rs.getString("Password")); 
       } 
       rs.close(); 
       st.close(); 
      } finally { 
       if (con!=null) try {con.close();}catch (Exception ignore) {} 
      } 

risposta

7

Poiché si chiama close() su un metodo ottenuto dal pool, è compito del pool eseguire ciò all'interno di questa chiamata di metodo. Non è necessario chiudere necessariamente la connessione al database in pool: potrebbe eseguire alcune operazioni di pulizia e quindi aggiungere nuovamente la connessione al pool.

Questa è già una risposta in Closing JDBC Connections in Pool

+0

Mantenere l'impostazione "MaxIdle" di DataSource sufficientemente alta da non chiudere tali connessioni. Impostandolo a 0 si spegne qualsiasi connessione chiusa, suppongo. – Hartmut

2

Questo esempio mostra solo how to create and use a data source. Per il pool di connessioni su Tomcat è possibile configurare JNDI.

// Sample 
public static Connection getConnectionFromPool() { 
    Context initCtx = new InitialContext(); 
    Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
    DataSource ds = (DataSource) envCtx.lookup("jdbc/TestDB"); 
    return ds.getConnection(); 
    ... 

Citazione di How connection pooling works in Java and JDBC:

un pool di connessione funziona eseguendo il lavoro di creazione connessioni prima del tempo, nel caso di un pool di connessioni JDBC, viene creato un pool di oggetti Connection al momento l'avvio del server dell'applicazione (o di un altro server). Questi oggetti vengono quindi gestiti da da un gestore di pool che disperde le connessioni quando vengono richieste dai client e le restituisce al pool quando determina che il client è terminato con l'oggetto Connection. Un gran numero di pulizie è coinvolto nella gestione di queste connessioni.

All'avvio del server del pool di connessione, viene creato un numero predeterminato di oggetti di connessione . Un'applicazione client eseguirà quindi una ricerca JNDI per recuperare un riferimento a un oggetto DataSource che implementa l'interfaccia ConnectionPoolDataSource. L'applicazione client non avrebbe bisogno di alcuna disposizione speciale per utilizzare l'origine dati in pool ; il codice non sarebbe diverso dal codice scritto per un DataSource non caricato.

3

OK, il mio male, che non ho visto la realizzazione di DataSource. Si estende DataSourceProxy che crea internamente una piscina prima di restituire un Connection basato sul PoolProperties

ho capito, la sua fino a questo DataSource per gestire le connessioni, anche se chiudo il con nel infine, DataSource può prendere le misure necessarie.

Aggiungi un commento/risposta se qualcuno la pensa diversamente.

Problemi correlati