2009-07-25 14 views
5

Architektonicznie, jaki jest najlepszy sposób obsługi JDBC z wieloma wątkami? Mam wiele wątków jednocześnie uzyskujących dostęp do bazy danych. Za pomocą pojedynczego połączenia i instrukcji pojawia się następujący komunikat o błędzie:Wielowątkowe JDBC

org.postgresql.util.PSQLException: Ten zestaw wyników jest zamknięty.

Czy powinienem używać wielu połączeń, wielu instrukcji lub czy istnieje lepsza metoda? Moja wstępna myśl polegała na użyciu jednego zdania na wątek, który gwarantowałby pojedynczy zestaw wyników na jedno zdanie.

Odpowiedz

4

Powinieneś użyć jednego połączenia na zadanie. Jeśli używasz łączenia połączeń, nie możesz użyć przygotowanych wyciągów przygotowanych przez inne połączenie. Wszystkie obiekty utworzone przez połączenie (ResultSet, PreparedStatements) są niepoprawne do użycia po powrocie połączenia do puli.

Tak, to podobnie

public void getSomeData() { 
    Connection conn = datasource.getConnection(); 
    PreparedStatement st; 
    try { 
    st = conn.prepareStatement(...); 
    st.execute(); 
    } finally { 
    close(st); 
    close(conn); 
    } 
} 

Więc w tym przypadku wszystkie obiekty DAO nie przyjmować połączenia, ale obiekt DataSource (java.sql.DataSource), który jest rzeczywiście poolable fabryka połączeń. I w każdej metodzie najpierw uzyskasz połączenie, wykonuj całą pracę i zamknij połączenie. Powinieneś jak najszybciej przywrócić połączenie z pulą. Po zwróceniu połączenia może nie zostać fizycznie zamknięty, ale ponownie zainicjowany (wszystkie aktywne transakcje zamknięte, wszystkie zmienne sesji zniszczone itp.)

1

Tak, użyj wielu połączeń z pulą połączeń. Otwórz połączenie na tyle długo, aby zrobić to, czego potrzebujesz, a następnie zamknij je, gdy tylko skończysz. Niech pula połączeń zajmie się "fizycznym" zarządzaniem połączeniem dla wydajności.

Powiązane problemy