Nasza standardowa sekcja kodu do korzystania z JDBC to ...
Connection conn = getConnection(...);
Statement stmt = conn.conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rset = stmt.executeQuery (sqlQuery);
// do stuff with rset
rset.close(); stmt.close(); conn.close();
Pytanie 1: Czy w przypadku korzystania z puli połączeń należy zamknąć połączenie na końcu? Jeśli tak, to czy nie utracono celu łączenia? A jeśli nie, w jaki sposób źródło danych wie, kiedy określone wystąpienie połączenia jest zwolnione i może zostać ponownie użyte? Jestem trochę zdezorientowany w tej sprawie, doceniam wszelkie wskazówki.
Pytanie 2: Czy poniższa metoda jest zbliżona do standardowej? Wygląda na to, że próbowano uzyskać połączenie z puli, a jeśli nie można ustanowić DataSource, użyj staroświeckiego DriverManager. Nie jesteśmy nawet pewni, która część jest wykonywana w czasie wykonywania. Powtarzając powyższe pytanie, czy należy zamknąć Połączenie wychodzące z takiej metody?
Dziękuję, - MS.
synchronized public Connection getConnection (boolean pooledConnection)
throws SQLException {
if (pooledConnection) {
if (ds == null) {
try {
Context envCtx = (Context)
new InitialContext().lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/NamedInTomcat");
return ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
}}
return (ds == null) ? getConnection (false) : ds.getConnection();
}
return DriverManager.getConnection(
"jdbc:mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord);
}
Edycja: myślę, że otrzymujemy połączenie w puli, ponieważ nie widzimy śladu stosu.
źródło
getConnection()
jest dziwne. Po prostu zrób to w c'tor lub bloku inicjalizacyjnym tej samej klasy, bez synchronizacji / kontroli null. Zostanie wywołany tylko raz. Aby uzyskać więcej wskazówek i początkowych przykładów, przydatny może być ten artykuł .close()
wszystkich wfinally
bloku tego samegotry
bloku, w którym je nabyłeś / stworzyłeś. Dzieje się tak całkowicie niezależnie od tego, czy jest to połączenie w puli, czy nie.Pule zazwyczaj zwracają opakowany obiekt Connection, w którym metoda close () jest zastępowana, zazwyczaj zwracając Connection do puli. Wywołanie funkcji close () jest w porządku i prawdopodobnie nadal jest wymagane.
Metoda close () prawdopodobnie wyglądałaby tak:
W przypadku drugiego pytania możesz dodać rejestrator, aby pokazać, czy dolny blok kiedykolwiek działa. Wyobrażam sobie, że chciałbyś tylko w ten czy inny sposób do konfiguracji połączeń z bazą danych. Puli używamy wyłącznie do dostępu do naszej bazy danych. Tak czy inaczej, zamknięcie połączenia byłoby bardzo ważne, aby zapobiec wyciekom.
źródło
Calling close() is OK and probably still required.
, brak wywołania close spowoduje wyciek połączenia, chyba że pula wdroży jakąś strategię odzyskiwaniaW rzeczywistości najlepszym podejściem do zarządzania połączeniami jest nieprzesyłanie ich do żadnego kodu w dowolnym miejscu.
Utwórz klasę SQLExecutor, która jest jedyną lokalizacją, która otwiera i zamyka połączenia.
Cała reszta aplikacji pompuje instrukcje do modułu wykonawczego, zamiast pobierać połączenia z puli i zarządzać nimi (lub niewłaściwie nimi zarządzać) w dowolnym miejscu.
Możesz mieć dowolną liczbę instancji modułu wykonawczego, ale nikt nie powinien pisać kodu, który otwiera i zamyka połączenia we własnym imieniu.
Dogodnie umożliwia to również rejestrowanie całego kodu SQL z jednego zestawu kodu.
źródło