Netty Server接受连接并且什么也不做

时间:2013-03-05 07:47:02

标签: java mysql netty

我没有找出这个错误的原因 “在以下异常之后,我的netty Server没有处理任何消息。”

  org.jboss.netty.channel.SimpleChannelHandler - EXCEPTION, please implement com.kakapo.unity.handler.RegistrationHandler.exceptionCaught() for proper handling.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 223,384,284 milliseconds ago.  The last packet sent successfully to the server was 223,384,284 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
    at sun.reflect.GeneratedConstructorAccessor13.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
    at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3364)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1983)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2293)
    at snaq.db.CachedPreparedStatement.executeQuery(CachedPreparedStatement.java:81)
    at com.kakapo.unity.handler.CustomIPFilterHandler.accept(CustomIPFilterHandler.java:46)
    at org.jboss.netty.handler.ipfilter.IpFilteringHandlerImpl.handleUpstream(IpFilteringHandlerImpl.java:118)
    at org.jboss.netty.handler.logging.LoggingHandler.handleUpstream(LoggingHandler.java:333)
    at org.jboss.netty.channel.Channels.fireChannelConnected(Channels.java:227)
    at org.jboss.netty.channel.socket.nio.NioWorker$RegisterTask.run(NioWorker.java:187)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.processRegisterTaskQueue(AbstractNioWorker.java:430)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:329)
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: java.net.SocketException: Connection timed out
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
    at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3345)
    ... 17 more

但是我已经将auto reconnect = true放到了我的JDBC上。并且还在使用OrderedMemoryAwareThreadPoolExecutor

ExecutionHandler channelExecutionHandler = new ExecutionHandler(new OrderedMemoryAwareThreadPoolExecutor(Runtime.getRuntime()
                .availableProcessors(), 0, 0)); 

我使用awaituninteruptable函数来关闭一个频道。 像

ctx.getChannel().write(new ErrMessage(e.getChannel().getRemoteAddress().toString()).getEncodedMessage())

这会导致任何类型的无限循环活动。 现在的情况是服务器接受连接并且不处理任何类型的消息。我们有工作线程和老板。但是日志处理程序工作正常。 我使用snaq.db.connection池来维护数据库连接。

1 个答案:

答案 0 :(得分:1)

您似乎使用DriverManager.getConnection()非常简单地使用MySQL连接。因此,您要么根本不关闭打开的连接,要么创建这么多连接,超出MySQL服务器的限制。

在高度并发的环境中(并且Netty当然是为此实现的)我强烈建议使用数据库连接池:c3p0commons-dbcp。通过适当的设置,您可以避免MySQL连接问题。