2013-03-05 83 views
0

我沒有找出此錯誤的原因 「我的netty服務器在以下異常後沒有處理任何消息。」Netty服務器接受連接並且什麼都不做

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 

但我已經把我的JDBC的auto reconnect = true。也正在使用OrderedMemoryAwareThreadPoolExecutor

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

我使用awaituninteruptable函數來關閉通道。 like

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

這是否導致任何類型的無限循環活動。 現在的情況是服務器接受連接,不處理任何類型的消息。我們有工作線程和老闆。但日誌處理程序工作正常。 正在使用snaq.db.connection池來維護數據庫連接。

回答

1

你似乎使用MySQL連接非常簡單,與DriverManager.getConnection()。因此,根本不要關閉打開的連接,或者創建如此多的連接,以至於超過MySQL服務器的限制。

在高度併發的環境中(Netty當然是爲此而實現的)我強烈建議使用數據庫連接池:c3p0commons-dbcp。通過適當的設置,您可以避免MySQL連接問題。

+0

感謝您的回答,但我已經使用數據庫連接池「snaq.db.connection池」。 – 2013-03-05 10:34:33

+0

那麼你能否告訴我們究竟連接池正在使用什麼,也可能需要調整它的設置。 – n1ckolas 2013-03-05 10:39:00

+0

snaq.db.ConnectionPool objConnectionPool =新連接池( 「DBPool對」(調用Runtime.getRuntime()。availableProcessors())* 6, \t \t \t \t \t(調用Runtime.getRuntime()。availableProcessors())* 6,( (調用Runtime.getRuntime()。availableProcessors())* 6) \t \t \t \t \t \t \t +(((調用Runtime.getRuntime()。availableProcessors())* 6)/ 2),0,mysqlString,用戶,密碼); – 2013-03-05 11:03:46

相關問題