seltsam SQLException - Konnte nicht abgerufen werden transation nur-lese-status server
Ich habe eine Quarz Job, führt eine Gespeicherte Prozedur in meiner MySQL-Datenbank alle 5 Minuten einmal, und für einige Grund, 1 aus 3 Ausführungen schlägt fehl und gibt diese seltsame Ausnahme. Ich habe gesucht und gesucht, was diese exception bedeutet, aber ich konnte keine Lösung finden. Hier ist der volle stack-trace:
java.sql.SQLException: Could not retrieve transation read-only status server
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:951)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941)
at com.mysql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3939)
at com.mysql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3910)
at com.mysql.jdbc.PreparedStatement.checkReadOnlySafeStatement(PreparedStatement.java:1258)
at com.mysql.jdbc.CallableStatement.checkReadOnlySafeStatement(CallableStatement.java:2656)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1278)
at com.mysql.jdbc.CallableStatement.execute(CallableStatement.java:920)
at com.mchange.v2.c3p0.impl.NewProxyCallableStatement.execute(NewProxyCallableStatement.java:3044)
at org.deadmandungeons.website.tasks.RankUpdateTask.execute(RankUpdateTask.java:30)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 1,198,219 milliseconds ago. The last packet sent successfully to the server was 950,420 milliseconds ago.
at sun.reflect.GeneratedConstructorAccessor43.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3673)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3562)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4113)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2812)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2761)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1612)
at com.mysql.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:3933)
... 9 more
Caused by: java.net.SocketException: Connection timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3116)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3573)
... 17 more
So, ich dachte, es ist das timing, weil es denkt, dass der MySQL-server im nur-Lesen-status?
Dies geschieht nur für diese Quarz-job, und nicht jeder anderen Zeit, wenn ich mit der Datenbank kommunizieren. Diese Ausführung ist natürlich passiert in einem anderen thread, aber ich denke nicht, dass hätte nichts damit zu tun.
Warum würde er denken, war der server im nur-Lesen-Modus?
Auch, ich glaube nicht, dass "transation" ist ein Wort, also, es ist so...
Die MySQL version ist 5.6.10-log, die ist relativ neu. Auch, in diesem thread, Ihr problem war, dass eine bestimmte variable nicht unterstützt wurde. Diese stack-trace zeigt, etwas ein wenig anders. Ich habe versucht, auf der Suche nach der genauen Meldung.
OK, siehe auch hier: toadworld.com/products/toad-extension-for-eclipse/f/42/t/... Sie sagen Sie einfach direkt 5.6 ist noch nicht vollständig getestet oder unterstützt. Aber dies ist von Oktober 2013. Ich denke, man sollte offen einen Fehler mit MySQL und sehen, was Sie sagen.
haben Sie diese überprüft ? stackoverflow.com/questions/6865538/...
Ich habe gesehen, das die Kommunikation schrieb aus Java vor; es bedeutet normalerweise, dass der client versucht, eine Verbindung zu verwenden, dass der server geschlossen hat. Es hat fast 1000 Sekunden seit dem erfolgreichen Paket, also vielleicht gibt es eine 15-minütige timeout der Verbindung auf den MySQL-server? Ich weiß es nicht kaufen, da eine version Problem, mag sein, aber die Netzwerk-Protokolle für dieses Zeug nicht bewegen zu schnell.
InformationsquelleAutor Jon McPherson | 2014-02-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sorry für das posting im alten thread,
Als stack-trace sagt
Bedeutet dies die Verbindung zwischen JDBC und DB ist kaputt.Nach Ihrer Beobachtung sagen Sie 1 von 3 job-Aufrufe fehl.
Haben Sie diese Arbeitsplätze geplant alle 5 Minuten je Spur der letzten erfolgreichen Nachricht zum server gesendet wird, ist ~15 Minuten vor.
Daher vermute ich, dass entweder
Wird es interessant zu sehen, wie die verbindungen verwaltet werden, Wie pro die logs, die ich sehe sind Sie mit c3p0.
Können Sie versuchen, die Einstellung
unreturnedConnectionTimeout
unddebugUnreturnedConnectionStackTraces
. Dies gibt Ihnen mehr Einblick in das undichte Verbindung oder db-Aufrufe, die unter langen.InformationsquelleAutor blob
Nimmt die Forschung im nirgendwo, als Sie die Jungs gesagt, aber der Fehler zeigt, was scheint zu sein, eine Datenbank wird bevölkert von zwei Anwendungen zur gleichen Zeit.
Haben Sie admin-Rechte auf diesem MySQL-server? Wenn Sie dies tun, sollten Sie versuchen, die Einstellung
als test um den Fehler zu reproduzieren. Nur, um Sie zu warnen, mit diesem Befehl wird Ihre Datenbank unwritable, so dass Sie nicht in der Lage, zum hinzufügen von Daten in Sie, bis Sie wiederherstellen dieser Konfiguration offensichtlich mit
Wenn das Ergebnis dieser test positiv ist (gleiche Fehler reproduziert worden wäre), sollten Sie versuchen, isolieren von Anwendungen, die Daten speichern, die auf Ihre Datenbank, um zu sehen, welcher Konflikt mit Quarz.
Tut mir Leid für die vage, aber ich hoffe, es gibt Ihnen helfen, einige...
InformationsquelleAutor Carlos Eduardo Santos