2016-07-19 3 views
1

Wir migrieren derzeit Anwendungen, die auf einem Liberty-Server (8.5.5.9) ausgeführt werden sollen. Wir haben festgestellt, dass Verbindungen zwischen dem App-Server und der Datenbank gelegentlich durch die Firewall beendet werden, da sie für längere Zeit nicht genutzt werden. Wenn dies geschieht, wird die Anwendung bei der nächsten HTTP-Anforderung eine dieser unterbrochenen Verbindungen erhalten.Kann ich in einem WAS Liberty-Verbindungspool Verbindungen beim Ausleihen validieren?

Zuvor verwendeten wir Apache Commons DBCP, um den Verbindungspool zu verwalten. Einer der configuration parameters in a DBCP conneciton pool ist "testOnBorrow", die verhindert, dass die Anwendung einer dieser schlechten Verbindungen übergeben wird.

Gibt es einen solchen Konfigurationsparameter in einer Liberty-verwalteten Datenquelle?

Bisher haben wir unsere Datenquelle wie folgt konfiguriert:

<dataSource jndiName="jdbc/ora" type="javax.sql.DataSource"> 
     <properties.oracle 
      user="example" password="{xor}AbCdEfGh123=" 
      URL="jdbc:oracle:thin:@example.com:1521:mydb" 
     /> 
     <connectionManager 
      minPoolSize="3" maxPoolSize="10" maxIdleTime="10m" 
      purgePolicy="ValidateAllConnections" 
     /> 
     <jdbcDriver id="oracle-driver" libraryRef="oracle-libs"/> 
    </dataSource> 

Die purgePolicy derzeit gesetzt ist, alle Verbindungen zu validieren, wenn man schlecht zu finden ist (zB über Nacht, wenn alle Verbindung für eine lange untätig gewesen Zeit). All dies verhindert jedoch, dass mehrere fehlerhafte Verbindungen nacheinander an die Anwendungen übergeben werden.

Eine Option im connectionManager wäre, einen altenTimout = "20m" festzulegen, um automatisch Verbindungen zu entfernen, die alt genug sind, um bereits von der Firewall beendet zu werden. Dies würde jedoch auch Verbindungen beenden, die kürzlich verwendet wurden (was verhindert, dass die Firewall sie bricht).

Fehle ich etwas offensichtlich hier? Danke!

+1

Ich würde vorschlagen, mit AlterTimeout, da viele Firewalls ist es egal, ob die Verbindung verwendet wird oder nicht und nur Verbindungen, die offen für lange Zeit sind. – Gas

Antwort

2

In diesem Szenario empfehle ich die Verwendung der maxIdleTime, die Sie bereits verwenden, aber reduzieren Sie Ihre minPoolSize auf 0 (oder entfernen Sie es, da der Standardwert 0 ist).

Per der maxIdleTime doc:

MaxIdleTime: Höhe der Zeit, nach der eine ungenutzte oder Leerlauf-Verbindung kann während der Poolpflege verworfen werden, wenn dies nicht auf den Pool unter der Mindestgröße reduzieren nicht tun.

Da haben Sie Ihre minPoolSize=3, wird der Pool maintenence tritt nicht, wenn es nur 3 schlechte Verbindungen im Pool ist zum Beispiel, weil der Wartungsthread wird nicht nicht die Poolgröße unter der Mindest nehmen nach dem Doc. Wenn Sie minPoolSize=0 setzen, sollte die maxIdleTime also alle schlechten Verbindungen bereinigen, wie Sie es in diesem Szenario erwarten würden.

So, hier ist die endgültige Konfiguration, die ich für Sie vorschlagen würde:

<dataSource jndiName="jdbc/ora" type="javax.sql.DataSource"> 
    <properties.oracle user="example" password="{xor}AbCdEfGh123=" 
         URL="jdbc:oracle:thin:@example.com:1521:mydb"/> 
    <connectionManager maxPoolSize="10" maxIdleTime="18m"/> 
    <jdbcDriver id="oracle-driver" libraryRef="oracle-libs"/> 
</dataSource> 

Der Wert maxIdleTime geht davon aus, dass die Firewall die Verbindungen nach 20 Minuten töten, und die Bereinigung auslösen nach 18 Minuten zu geben, um der Cleanup-Thread ein 2-Minuten-Fenster, um die bald-schlechten-Verbindungen zu bereinigen.

+0

Ich werde es heute versuchen, um zu sehen, ob es wie angekündigt funktioniert. Danke für die Hinweise. –

+0

Sieht gut aus ... nochmals vielen Dank! –

Verwandte Themen