Verbindung Zeit sich Fragen nach Trägheit
Wir haben eine api, die verwendet hibernate als ORM-tool und verwenden wir c3p0 als Verbindungs-pool-handler. Wir haben keine Probleme, wenn wir unter Last. Allerdings sind wir läuft aus in "nicht um eine-Verbindung" - Ausnahmen aus, wenn die api wurde nicht für einen Tag oder so. Also, wenn kein Körper nutzt das api, über das Wochenende, wir bekommen Verbindungsfehler auf Montag morgen.
Verursacht durch: java.sql.SQLException: Ein Versuch von einem Kunden an der Kasse eine Verbindung hat das Zeitlimit überschritten.
Verwenden wir mysql als Datenbank. Auf meiner recherche habe ich erfahren, dass mySQL verbindungen abgestanden nach 8 Stunden oder so. Es könnte möglich sein, dass die Verbindung pool ist was aus einer veralteten Verbindung zum client und damit die Verbindung timeout Ausnahmen für den client.
Derzeit haben wir keine Verbindung testen konfiguriert C3Po. Sagen wir, wenn ich IdleTestPeriod um die Verbindung zu testen, bevor Sie an den client durch den pool. Was dann passiert, wenn alle meine verbindungen schlägt fehl der test an einem Punkt der Zeit? Wird diesen fehlgeschlagenen verbindungen aus dem pool entfernt werden und neue aktive verbindungen generiert werden, wieder?
Derzeit ist dies die c3p0 Einstellungen, die wir verwenden. Andere Gründe möglich für dieses problem?
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${ ---- }"/>
<property name="jdbcUrl" value="${ ---- }"/>
<property name="user" value="${ ---- }"/>
<property name="password" value="${ ------ }"/>
<property name="minPoolSize" value="5"/>
<property name="acquireIncrement" value="5" />
<property name="maxPoolSize" value="125" />
<property name="maxStatements" value="10" />
<property name="maxIdleTime" value="180" />
<property name="maxIdleTimeExcessConnections" value="30" />
<property name="checkoutTimeout" value="3000" />
<property name="preferredTestQuery" value="SELECT 1" />
</bean>
Du musst angemeldet sein, um einen Kommentar abzugeben.
So haben Sie eine checkoutTimeout von 3 Sekunden (3000 MS) eingestellt. Das ist die Ausnahme, die Sie sehen. Kunden sind nur zulässig, warten Sie drei Sekunden, um Kasse eine Verbindung aus dem pool, wenn drei Sekunden ist nicht genug, Sie sehen, die Ausnahme.
Die Frage ist, warum sind die Kunden so lange um eine Verbindung zu erhalten? Normalerweise Check-out eine Verbindung ist eine ziemlich schnelle Bedienung. Aber wenn alle Verbindungen überprüft, dann die Kunden müssen warten, für die (langsame) Verbindung Erwerb aus der Datenbank.
Haben Sie Ihren pool so konfiguriert, ziemlich aggressiv zu pflücken Verbindungen. Eine beliebige Anzahl von Verbindungen über minPoolSize=5 vernichtet werden, wenn Sie im Leerlauf für mehr als maxIdleTimeExcessConnections=30 Sekunden. Aber dein pool ist konfiguriert für großflächige Ausbrüche: maxPoolSize=125. Nehme an, dass deine app eine Weile still, und dann wird ein platzen der Verbindungsanforderungen von clients. Der pool wird schnell aus Verbindungen und starten Sie zu erwerben, in bursts von acquireIncrement=5. Aber wenn es plötzlich 25 clients und der pool hat nur 5 Anschlüsse, es ist nicht unwahrscheinlich, dass der 25-client kann eine Zeitüberschreitung vor dem Erwerb einer Verbindung.
Gibt es viel Sie tun können. Diese tweaks sind trennbar, können Sie mischen oder entsprechen, wie Sie sehen, passen.
Pflücken Leerlauf "überschüssige" Verbindungen weniger aggressiv, so dass in der Regel Ihr pool hat einige erforderliche Kapazität, um Ausbrüche von Anfragen. Sie könnte herunterfallen maxIdleTimeExcessConnections vollständig, und lassen Sie die Verbindungen langsam verwelken nach maxIdleTime=180 Sekunden der Nichtnutzung. (Nachteil? Eine größere Ressourcenverbrauch für mehr während Perioden der Inaktivität.)
Set minPoolSize auf einen höheren Wert, so dass es unwahrscheinlich ist, dass der pool werden sehen, ein Ausbruch von Aktivität, für die es viel zu wenige Verbindungen. (Nachteil? Größere permanente Ressourcenverbrauch.)
Drop checkoutTimeout aus deiner config. c3p0 in der Standardeinstellung, dass clients, um unbegrenzt zu warten für eine Verbindung. (Nachteil? Vielleicht bevorzugen Sie Kunden, um schnell Bericht ein Fehler statt zu warten, bis möglich ist Erfolg.)
Ich glaube nicht, dass das problem, das Sie beobachten, hat viel zu tun mit Verbindung testen oder MySQL-timeouts per se, aber das bedeutet nicht, sollten Sie nicht mit diesen Fragen. Ich werde aufschieben zu nobeh Beratung auf die MySQL-reconnect-Problem. (Ich bin kein großer MySQL-user.) Sie sollten prüfen, die Durchführung Verbindung testen. Sie haben eine preferredTestQuery, so sollten die tests ziemlich schnell. Meine übliche Wahl ist die Verwendung testConnectionOnCheckin und idleConnectionTestPeriod. Sehen http://www.mchange.com/projects/c3p0/#configuring_connection_testing
Glück!
In der Sektion Hohe Verfügbarkeit und clustering in MySQL-Java-Connector, werfen Sie einen Blick auf die Eigenschaften, insbesondere
autoReconnect
undautoReconnetForPools
.Verwenden Sie die Eigenschaften in Ihrer JDBC-Verbindung-URL.
Sie haben mir geholfen, bevor Sie, wenn Sie MySQL, Hibernate und C3P0. Hoffe, dass dies hilft.