Gibt es eine Möglichkeit den JBoss Connection-Pool wieder an Oracle haben, wenn Verbindungen schlecht gehen?

StackOverflow https://stackoverflow.com/questions/128527

Frage

Wir haben unsere JBoss und Oracle auf separaten Servern. Die Verbindungen scheinen fallen gelassen zu werden und verursacht Probleme mit JBoss. Wie kann ich die JBoss Oracle wieder, wenn die Verbindung schlecht ist, während wir herausfinden, warum die Verbindungen in erster Linie fallen gelassen zu werden?

War es hilfreich?

Lösung

Es gibt in der Regel eine Konfigurationsoption auf den Pool eine Validierungsabfrage zu ermöglichen, auf borrow ausgeführt werden. Wenn die Validierung Abfrage erfolgreich ausgeführt wird, wird der Pool, die Verbindung zurück. Wenn die Abfrage nicht erfolgreich ausgeführt, wird der Pool eine neue Verbindung erstellen.

JBoss Wiki die verschiedenen Attribute des Pools dokumentiert.

<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>

Scheint, wie es sollte es tun.

Andere Tipps

Während Sie die alten verwenden können „wählen Sie 1 aus dual“ Trick, der Nachteil dabei ist, dass es gibt eine zusätzliche Abfrage jedes Mal, wenn Sie eine Verbindung aus dem Pool zu leihen. Für hohe Volumen, das ist verschwenderisch.

JBoss bietet eine besondere Verbindung Validator, die für Oracle verwendet werden soll:

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

Dies macht die Verwendung des proprietären ping () -Methode auf der Connection-Klasse Oracle JDBC, und verwendet die zugrunde liegenden Netzwerk-Code des Fahrers zu bestimmen, ob die Verbindung noch am Leben ist.

Es ist jedoch immer noch verschwenderisch diese jedes Mal eine Verbindung laufen entlehnt ist, so dass Sie die Anlage nutzen möchten, wo ein Hintergrundthread die Verbindungen im Pool überprüft, und still verwirft die Toten. Das ist viel effizienter, sondern bedeutet, dass, wenn die Verbindungen tun geht tot, jeder Versuch, sich vor dem Hintergrund-Thread zu verwenden, läuft seine Überprüfung fehl.

Siehe Wiki docs , wie Sie den Hintergrund konfigurieren Überprüfung (für background-validation-millis aussehen).

Nicht genug rep für einen Kommentar, so dass es in Form einer Antwort. Die 'Select 1 from dual' und org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker Methode des skaffman äquivalent sind, obwohl die Verbindungsüberprüfung eine Abstraktionsebene bietet. Wir hatten den Oracle-JDBC-Treiber für eine Fehlerbehebung Übung und Oracle interne Implementierung des Ping zu dekompilieren ist ein 'Select 'x' from dual' auszuführen. Natch.

JBoss bietet 2 Möglichkeiten, um Validate-Verbindung: - Ping basiert UND - Abfrage basiert

Sie können je nach Anforderung verwenden. Dies soll durch separaten Thread nach Dauer definiert in Datenquelle-Konfigurationsdatei.

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

Einige Zeit, wenn Sie nicht richtig Oracle-Treiber bei Jboss haben, können Sie classcast oder ähnliche Fehlermeldung erhalten und für diese Verbindung kann Dropout von Verbindungspool starten. Sie können Ihre eigene ConnectionValidator Klasse erstellen durch die Implementierung org.jboss.resource.adapter.jdbc.ValidConnectionChecker Schnittstelle versuchen. Diese Schnittstelle stellt nur einzelne Methode ‚isValidConnection()‘ und ‚NULL‘ als Gegenleistung für gültige Verbindung erwartet.

Beispiel:

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;
   }
}

Wir haben vor kurzem haben einige schwebenden Anforderungshandhabungsfehler, die durch verwaiste Orakel DBMS_LOCK Sitzung Sperren, die auf unbestimmte Zeit in der clientseitige Verbindungspool beibehalten.

So, hier ist eine Lösung, die Sitzung Ablauf in 30 Minuten zwingt aber keinen Einfluss auf Programmfunktionen:

<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>

Dies kann einige Verlangsamung Verfahren zum Erhalt von Verbindungen Pool einzubeziehen. Stellen Sie sicher, dass dies unter Belastung zu testen.

Ein kleines Update @ skaffman Antwort. In JBoss 7 müssen Sie „class-name“ -Attribut verwenden, wenn gültige Verbindungsprüfer einstellen und auch Paket ist anders:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top