我有一个Quartz作业,每5分钟在我的MySQL数据库中执行一次存储过程,并且出于某种原因,3次执行中有1次失败并给出了这个奇怪的异常。我搜索并搜索了这个异常的含义,但我找不到解决方案。这是完整的堆栈跟踪:
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
所以我认为它超时是因为它认为MySQL服务器处于只读状态? 这只发生在这个石英作业中,而不是在我与数据库通信时的任何其他时间。这个执行当然是在另一个线程中发生的,但我不认为这与它有任何关系。 为什么认为服务器处于只读模式?
另外,我不认为" transation"是一个词,所以有......
答案 0 :(得分:2)
很抱歉在旧帖子上发帖,
堆栈跟踪说
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
这意味着JDBC和DB之间的链接被破坏。根据您的观察,您说3个作业调用中有1个失败。
您每隔5分钟安排一次这些作业,并且根据跟踪,发送到服务器的最后一条成功消息大约需要15分钟。
因此我怀疑
看看如何管理连接会很有趣,按照日志,我看到你使用的是c3p0。
您可以尝试设置unreturnedConnectionTimeout
和debugUnreturnedConnectionStackTraces
。这将使您更深入地了解连接泄漏或db调用,这需要很长时间。
答案 1 :(得分:0)
正如你们所说,研究无处可去,但错误显示了同时由两个应用程序填充的数据库。
您是否拥有此MySQL服务器的管理员权限?如果你这样做,你应该尝试设置
FLUSH TABLES WITH READ LOCK;
SET GLOBAL READ_ONLY=ON;
作为重现错误的测试。只是为了警告你,这个命令使你的数据库不可写,所以在恢复这个配置之前你将无法在其中添加数据,显然是
SET GLOBAL READ_ONLY=0;
UNLOCK TABLES;
如果此测试的结果是肯定的(已复制相同的错误),您应该尝试隔离在数据库中存储数据的应用程序,以找出哪个与Quartz冲突。
我很抱歉模糊,但我希望它会给你一些帮助......