2017-07-19 1 views
1

Ich habe eine Java-Anwendung (jar) als OSGI-Bundle in Adobe Experience Manager installiert.MyBatis DB Verbindung Failover-Mechanismus funktioniert nicht

In Java-Anwendung Ich habe folgende Datenquelle Konfiguration: 1. Ich bin mit Mybatis-3-Datenquelle zusammengefasste Verbindungen folgenden bemannten verwalten: Mit den Eigenschaften wie in http://www.mybatis.org/mybatis-3/getting-started.html erwähnt

2. Creating SQL Session factory in following manner : 
     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); 

3. Using SQL Server 2014 as my database. 

Wir haben Cluster von DB-Servern, wann immer wir einen Patch auf Datenbank anwenden müssen, wechseln wir den DB-Server. Obwohl die dataSource-URL gleich bleibt, führt die Anwendung zu Fehlern bei DB-Verbindungsfehlern. Das Problem wird erst nach dem Neustart des Pakets gelöst. Kann der Verbindungspool automatisch wiederhergestellt oder wiederhergestellt werden? Ich bin neu in MyBatis, SQL Server und AEM, jede Hilfe wird sehr geschätzt.

+0

Ich gehe davon aus, dass mit Ihrem Cold-Standby-Ansatz alle bereits geöffneten Datenbankverbindungen fehlschlagen. Entschuldigung, ich kenne MyBatis nicht. Aber entweder finden Sie einen besseren Cluster-Ansatz, oder Sie sollten ConnectionPool mit Verifikation haben. Das bedeutet, dass der ConnectionPool vor dem Verteilen der Verbindung eine extrem einfache Abfrage durchführt. Wenn dies fehlschlägt, wird diese fehlerhafte Verbindung gelöscht und eine neue geöffnet. Jemand anderes hat auch danach gefragt, aber keine Antwort erhalten: http://mybatis-user.963551.n3.nabble.com/Connection-is-invalid-how-to-check-for-this-and- get-a-valid-connection-td4026961.html –

Antwort

2

Die einfachste Problemumgehung für Sie besteht darin, eine Pool-Ping-Abfrage einzurichten. Es scheint, dass Ihre Verbindungen den Wechsel in die Cold-Standby-Datenbank nicht überstehen. Sie müssen wieder geöffnet werden. Mit dieser Abfrage kann der Verbindungspool prüfen, ob eine Verbindung noch in Ordnung ist. Wenn nicht, wird diese fehlerhafte Verbindung geschlossen.

Nachdem ich meinen Kommentar gegeben habe, schaute ich auf http://www.mybatis.org/mybatis-3/configuration.html. Dort sollten Sie für die Parameter sehen

  • poolPingQuery
  • poolPingEnabled

Ich würde es versuchen, mit der folgenden Konfiguration

<dataSource type="POOLED"> 
    ... 
    <property name="poolPingQuery" value="/* ping */ SELECT 1"/> 
    <property name="poolPingEnabled" value="true"/> 
</dataSource> 

aber darüber im Klaren sein, dass dies immer noch kein graziöser Schalter. Es prüft nur auf Verbindungen im Pool. Alle laufenden Transaktionen erhalten weiterhin einen Fehler. Aber es könnte in Ordnung sein, wenn Ihre Transaktionen kurz, nicht massiv parallel und nicht sehr kritisch sind.

+0

Vielen Dank für die schnelle Bearbeitung, ich lese über PoolPingQuery, aber ich habe nicht gefunden, dass es verwendet werden kann, um die Verbindungen wiederherzustellen. Gibt es einen Weg zu einem vernünftigen Wechsel, um Fehler für laufende Benutzersitzungen zu vermeiden? – Narendra

+1

Ich denke, das wird nicht mit Ihrem Active/Passive SQL Server Cluster funktionieren. Sie benötigen eine Phase mit beiden aktiven Knoten. In dieser Aktiv/Aktiv-Phase müssen Sie alle Verbindungen ordnungsgemäß wechseln. Wenn Failover so wichtig ist, müssen Sie möglicherweise das Verbindungs-Pooling aufgeben. Dies könnte einige Dinge besser machen. Aber die Leistung wird leiden. –

+0

Ich schaute auf die SQL-Server-Dokumente. Darin heißt es: "Wenn ein Failover auftritt, wird der virtuelle Netzwerkname (VNN) nach dem Start für den neuen aktiven Knoten registriert.Dieser Prozess ist für den Client oder die Anwendung, die ** mit SQL Server verbindet, transparent und ** minimiert die Ausfallzeit **, die die Anwendung oder die Clients während eines Fehlers erleben. " Die Ausfallsicherung funktioniert also nur für ** neue ** Ich fürchte, Sie müssen sorgfältig testen, wie sich der SQL-Cluster verhält. Schließlich funktioniert die "Select 1" auch dann, wenn der verbundene Knoten NICHT AKTIV ist. –