Czy jest jakiś sposób na ponowne połączenie puli połączeń JBoss z Oracle, gdy połączenia ulegną awarii?

Mamy nasze JBoss i Oracle na osobnych serwerach. Połączenia wydają się być porzucone i powoduje problemy z JBoss. Jak mogę ponownie połączyć JBoss z Oracle, jeśli połączenie jest złe, a my dowiemy się, dlaczego połączenia są odrzucane w pierwszej kolejności?

Author: Joshua, 2008-09-24

6 answers

W Puli zazwyczaj znajduje się opcja konfiguracyjna umożliwiająca wykonanie zapytania walidacyjnego przy pożyczaniu. Jeśli zapytanie walidacyjne zostanie pomyślnie wykonane, Pula zwróci to połączenie. Jeśli zapytanie nie zostanie wykonane pomyślnie, Pula utworzy nowe połączenie.

JBoss Wiki dokumentuje różne atrybuty puli.

<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
Wygląda na to, że powinno zadziałać.
 26
Author: Steve K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-24 15:03:37

Chociaż możesz użyć starego triku "wybierz 1 z dual", minusem jest to, że za każdym razem, gdy pożyczasz połączenie z puli, generuje dodatkowe zapytanie. W przypadku dużych ilości jest to marnotrawstwo.

JBoss zapewnia specjalny walidator połączeń, który powinien być używany dla Oracle:

<valid-connection-checker-class-name>
    org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
</valid-connection-checker-class-name>

To używa zastrzeżonej metody ping() w klasie połączeń Oracle JDBC i używa podstawowego kodu sieciowego sterownika do określenia, czy połączenie jest nadal / align = "left" /

Jednak nadal jest marnotrawne uruchamianie tego za każdym razem, gdy połączenie jest pożyczone, więc możesz użyć obiektu, w którym wątek w tle sprawdza połączenia w Puli i po cichu odrzuca martwe. Jest to o wiele wydajniejsze, ale oznacza, że jeśli połączenia przestaną działać, próba ich użycia Przed uruchomieniem wątku tła zakończy się niepowodzeniem.

Zobacz wiki docs aby dowiedzieć się, jak skonfigurować sprawdzanie tła (Szukaj background-validation-millis).

 32
Author: skaffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-22 13:32:32

Za mało reputacji na komentarz, więc jest w formie odpowiedzi. Metoda 'Select 1 from dual' i metoda skaffmana org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker są równoważne, chociaż sprawdzenie połączenia zapewnia poziom abstrakcji. Musieliśmy dekompilować sterowniki oracle jdbc w celu rozwiązywania problemów, a wewnętrzna implementacja Oracle ping polega na wykonaniu 'Select 'x' from dual'. Natch.

 9
Author: abh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-20 16:56:08

JBoss zapewnia 2 sposoby walidacji połączenia: - Oparte na pingu i - Query based

Możesz użyć zgodnie z wymaganiami. Jest to zaplanowane przez osobny wątek zgodnie z czasem trwania zdefiniowanym w pliku konfiguracyjnym datasource.

<background-validation>true</background-validation> <background-validation-minutes>1</background-validation-minutes>

Jakiś czas, jeśli nie masz odpowiedniego sterownika oracle w Jboss, możesz uzyskać classcast lub powiązany błąd i dla tego połączenia możesz rozpocząć rezygnację z puli połączeń. Możesz spróbować utworzyć własną klasę ConnectionValidator implementując Interfejs org.jboss.resource.adapter.jdbc.ValidConnectionChecker. Interfejs ten dostarcza tylko jedną metodę 'isValidConnection() 'i oczekuje' NULL ' w zamian za poprawne połączenie.

Ex:

public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable {

   private Method ping;

   // The timeout (apparently the timeout is ignored?)
   private static Object[] params = new Object[] { new Integer(5000) };

   public SQLException isValidConnection(Connection c) {

       try {
           Integer status = (Integer) ping.invoke(c, params);

           if (status.intValue() < 0) {
               return new SQLException("pingDatabase failed status=" + status);
           }

       }
       catch (Exception e) {
           log.warn("Unexpected error in pingDatabase", e);
       }

       // OK
       return null;
   }
}
 6
Author: arviarya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-20 22:34:53

Ostatnio mieliśmy pewne błędy w obsłudze zmiennych żądań spowodowane osieroconymi blokadami sesji oracle DBMS_LOCK, które utrzymywały się na czas nieokreślony w puli połączeń po stronie klienta.

Oto rozwiązanie, które wymusza wygaśnięcie sesji w ciągu 30 minut, ale nie wpływa na działanie aplikacji:

<check-valid-connection-sql>select case when 30/60/24 > sysdate-LOGON_TIME then 1 else 1/0 end 
from V$SESSION where AUDSID = userenv('SESSIONID')</check-valid-connection-sql>

Może to wiązać się z pewnym spowolnieniem procesu uzyskiwania połączeń z puli. Upewnij się, że przetestujesz to pod obciążeniem.

 3
Author: Vadzim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-22 13:45:32

Mała aktualizacja do odpowiedzi @ skaffman. W JBoss 7 musisz użyć atrybutu "class-name" przy ustawianiu poprawnego sprawdzania połączenia, a także Pakiet jest inny:

<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker" />

 2
Author: Jakub Godoniuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-08 15:24:44