2013-05-07 17 views
7

Widząc w tym przykładzie autonomiczny przykład Java, uzyskuje się połączenie przy użyciu datasource.getConnection(), co jest fajne. Ale w ostatnim bloku jest napisane: con.close().Pula połączeń JDBC Tomcata (połączenie zwalniające)

Pytanie: Kiedy zaimplementuję to, wydaje się oczywiste, że con otrzymam ze źródła danych zostanie zamknięte za każdym razem w końcu. Kiedy to nastąpi, czy mechanizm łączenia połączeń uzyska nowe połączenie i doda je do puli?

Zakładam, że powinno być wywołanie metody, takie jak releaseConnection(), które pozwoli puli podjąć samodzielną decyzję, czy ją zamknąć, czy też pozostawić ją otwartą do innego użytku.

Próbowałem również zrobić to ConnectionPool aPool = datasource.createPool(); Ale widzę, że nie ma nic takiego jak połączenie wersji na tym aPool.

Chyba czegoś tu brakuje? Doceń swoją pomoc.

Fragment kodu z 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) {} 
      } 

Odpowiedz

7

Od czasu wywołania metody close() dla metody uzyskanej z puli, do puli należy postępować zgodnie z tym wywołaniem metody. Nie musi koniecznie zamykać połączenia z pulą danych - może wykonać pewne czyszczenie, a następnie dodać połączenie z powrotem do puli.

to już odpowiedział Closing JDBC Connections in Pool

+0

Zachowaj ustawienie "MaxIdle" dla źródła danych wystarczająco dużego, aby te połączenia nie były zamykane. Ustawienie na 0 spowoduje wyłączenie wszelkich zamkniętych połączeń, jak sądzę. – Hartmut

2

Ten przykład pokazuje tylko how to create and use a data source. Dla puli połączeń na Tomcat możesz skonfigurować 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(); 
    ... 

Cytat How connection pooling works in Java and JDBC:

puli połączeń działa wykonując pracę tworząc połączeń z wyprzedzeniem, w przypadku puli połączeń JDBC, tworzony jest pula obiektów Connection w momencie uruchomienia serwera aplikacji (lub innego serwera). Obiekty te są następnie zarządzane przez menedżera puli, który rozprasza połączenia, ponieważ są żądane przez klientów i zwraca je do puli, gdy ustali, że klient jest zakończony za pomocą obiektu Connection. Znaczna część prac porządkowych to zaangażowana w zarządzanie tymi połączeniami.

Po uruchomieniu serwera puli połączeń tworzy z góry określoną liczbę obiektów połączenia. Aplikacja kliencka następnie wykona przeszukiwanie JNDI w celu pobrania odwołania do obiektu DataSource, który implementuje interfejs ConnectionPoolDataSource. Aplikacja kliencka nie będzie potrzebować żadnych specjalnych postanowień, aby móc korzystać ze zbiorczego źródła danych o numerze ; kod nie różni się od kodu napisanego dla niepołączonego źródła danych.

3

OK, mój błąd, że nie widzę realizację DataSource. Rozciąga DataSourceProxy że wewnętrznie tworzy pulę przed przekazaniem Connection oparciu o PoolProperties

Rozumiem jego zapisu do tego źródła danych do obsługi połączeń, chociaż zamknąć con w końcu, DataSource może podjąć niezbędne działania.

Dodaj komentarz/odpowiedź, jeśli ktoś myśli inaczej.

Powiązane problemy