2009-09-23 11 views
7

W aplikacji internetowej Java, nad którą pracuję, używamy OracleConnectionPoolDataSource dla funkcji puli połączeń z bazą danych. Każde połączenie getConnection zawiera identyfikator Oracle ID użytkownika i hasło. Tak więc każdy użytkownik w pewnym sensie kończy swoją własną pulą połączeń z bazą danych.Ustawianie i aktualizowanie właściwości puli połączeń (OracleConnectionPoolDataSource) w celu uzyskania najlepszej wydajności

Obecnie używamy domyślnych wartości dla większości właściwości. Obejmuje

  • MinLimit ustawiony na 0
  • MaxLimit zestaw do Integer.MAX_VALUE
  • MaxStatementsLimit ustawiony na 0
  • InactivityTimeout zestaw do 0
  • TimeToLiveTimeout zestaw do 0
  • AbandonedConnectionTimeout zestaw do 0
  • PropertyCheckInterval zestawu do 900
  • ConnectionWaitTimeout zestaw do 0

Więcej informacji na temat tych właściwości można znaleźć na Connection Cache Properties.

Obecnie nie mamy żadnych problemów z rażącym połączeniem z bazą danych, ale myślę, że wydajność może być lepsza. Moje pytanie brzmi: czy ktoś ma dobrą radę lub dobre źródło informacji na temat tego, co powinniśmy wziąć pod uwagę przy dostosowywaniu tych wartości.

Odpowiedz

6

Przewodnik po wydajności serwera aplikacji Oracle dla wydania 10g 3 (10.1.3.1) zawiera ostateczne informacje na temat how to optimize the connection pool parameters.

Informacje są przydatne w przypadku niemal wszystkich scenariuszy, w których aplikacja korzysta z puli połączeń do zarządzania połączeniami z bazą danych Oracle, bez względu na używany serwer aplikacji.

Na przykład zawsze dobrze jest ustawić wartość minimalnego rozmiaru basenu. Jeśli chodzi o maksymalną wielkość puli, wartość nie powinna być zbyt wysoka, ponieważ mogłaby załadować słuchacza, szczególnie jeśli aplikacja ma tendencję do nie zamykania połączeń powodujących wyciek.

Zaleca się ustawienie rozsądnej wartości pamięci podręcznej instrukcji, ponieważ pozwala to na buforowanie przygotowanych instrukcji, co pozwala uzyskać lepszą wydajność.

Przerwy w pracy należy również wybierać z myślą o środowisku. Na przykład w większości przypadków limit czasu oczekiwania na połączenie nie powinien wynosić zero, ponieważ może to spowodować wyjątki SQLEx, gdy połączenia fizyczne nie mogą zostać zainicjowane w puli w wystarczającym przedziale czasu. Limit czasu nieaktywności powinien być wystarczająco duży, aby połączenia zostały usunięte dopiero po wystarczającym okresie bezczynności; zbyt niska wartość skutkowałaby tworzeniem połączeń fizycznych i zbyt częstym ich upuszczaniem.

EDYCJA: Wskazówki podane w Przewodniku po wydajności odnoszą się do klasy oracle.jdbc.pool.OracleDataSource, która jest wykorzystywana przez serwer aplikacji Oracle 10g w zarządzanych źródłach danych do bazy danych Oracle. Większość z pewnością przeniesie się do OracleConnectionPoolDataSource.

+0

InactivityTimeout: Po wygaśnięciu funkcji InactivityTimeout fizyczne połączenie zostanie zamknięte. Jednak rozmiar pamięci podręcznej nie może zmniejszać się poniżej wartości minLimit, o ile została ustawiona. - To jest z dokumentacji Oracle i mówi, że minLimit nie zmniejszy się, nawet jeśli wszystkie obiekty połączeń zostaną zamknięte przez timeout. Czy to oznacza, że ​​pozwala czerpać nieświeży obiekt z puli? http://docs.oracle.com/cd/B14117_01/java.101/b10979/conncache.htm#CDEBCBJC –

2

Moja pierwsza rada: Profil.

Moja druga rada: profil.

Co spowalnia aplikację, które wywołania metody powodują obniżenie wydajności aplikacji?

Czy ciągle czekasz na tworzenie nowych połączeń? Następnie ustaw MinLimit na wartość wyższą niż 0, to samo z "limitem początkowym", aby mieć kilka dostępnych do uruchomienia. Jeśli chcesz, aby MaxLimit był nieskończoności, ustaw go na "0", ustawienie 0 oznacza brak limitu.

Czy tworzysz nowe połączenia, gdy naprawdę powinieneś używać istniejącego, ale nieaktywnego połączenia? Ustaw wartość InactivityTimeout na wartość inną niż 0. To samo dotyczy AbandonedConnectionTimeout.

pamiętać, że pierwszą rzeczą, którą chciałbym majstrować przy byłby „initial-limit'-

z Oracle o początkowej terminu

Ustawia rozmiar pamięci podręcznej połączenia gdy bufor jest początkowo utworzony lub ponownie zainicjowany. Gdy ta właściwość jest ustawiona na wartość większą niż niż 0, to wiele połączeń jest wstępnie utworzonych i jest gotowych do użycia. Ta właściwość jest zwykle używana do skracania czasu "ramp-up" w zalewaniu pamięci podręcznej do optymalnego rozmiaru.

5

Czy rozważałeś użycie nowego Oracle UCP? Cytat z 11g feature list kopalni (nacisk):

1.4.1.29 Uniwersalny Bilard (UCP) dla JDBC

Uniwersalny Bilard dla JDBC zastępuje niejawnej Cache Connection i zapewnia następujące funkcje:

  • Etykiety połączeń, zbieranie połączeń, rejestrowanie i statystyki
  • Wydajność i ulepszenia stabilizacji
  • Poprawa diagnostyki i statystyki lub metryki

UCP dla JDBC udostępnia zaawansowane funkcje puli połączeń, lepszą wydajność i lepszą diagnosability problemów przyłączeniowych.

+2

Podoba mi się ta odpowiedź. Niestety nie możemy obecnie uaktualnić do nowych sterowników. – Prof

+1

Powinieneś to rozważyć. IIRC funkcja gromadzenia danych Oracle DataSource została uznana za przestarzałą na korzyść korzystania z UCP. – yawn

Powiązane problemy