mycat问题集锦与解决方法

1、Connection reset by peer

04/16 11:08:09.198  DEBUG [$_NIOREACTOR-3-RW] (NIOSocketWR.java:58) -caught err:
java.io.IOException: Connection reset by peer
    at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
    at sun.nio.ch.IOUtil.write(IOUtil.java:51)
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:487)
    at org.opencloudb.net.NIOSocketWR.write0(NIOSocketWR.java:98)
    at org.opencloudb.net.NIOSocketWR.doNextWriteCheck(NIOSocketWR.java:42)
    at org.opencloudb.net.AbstractConnection.write(AbstractConnection.java:328)
    at org.opencloudb.net.mysql.HandshakePacket.write(HandshakePacket.java:110)
    at org.opencloudb.net.FrontendConnection.register(FrontendConnection.java:355)
    at org.opencloudb.net.NIOReactor$RW.register(NIOReactor.java:155)
    at org.opencloudb.net.NIOReactor$RW.run(NIOReactor.java:86)
    at java.lang.Thread.run(Thread.java:745)

分析:
看报错代码,如下:

while (buffer.hasRemaining()) {
                written = channel.write(buffer);

原因猜测
连接已经被关闭,但还有内容在往这个连接中写。

深层原因
连接mycat的连接池的空闲检测心跳出现故障(服务端空闲超时时间设置过短或客户端心跳检测语句的间隔太长。mysql的服务端闲置超时时间默认为8小时,dba一般会改小)
解决方法
使数据库连接池的心跳检测机制生效,使连接不会被服务端认为闲置超时。
如我们使用的bonecp连接池,设置两个参数控制:

#SQL statement to use for keep-alive/test of connection.
db.connectionTestStatement=select 1 
#Connections older than this are sent a keep-alive statement.
db.idleConnectionTestPeriodInSeconds=900

表示900秒种往服务端发送一个select 1语句查询,这让服务端知道连接没有空闲。

2、Last packet sent to the server was 2 ms ago.

Last packet sent to the server was 2 ms ago.
; SQL []; Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.io.EOFException

STACKTRACE:

java.io.EOFException
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1963)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2375)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)

原因:
连接闲置超时被服务端主动断开了连接。
如果是没有用数据库连接池,没有使用连接主动发心跳检测语句的,一般都会碰到该问题。
像数据库连接池(如c3p0,bonecp,druid等)都有发送心跳检测的功能。
解决方法:

你可能感兴趣的:(mycat专区)