最近用mina框架开发一个应用,鉴于本人对mina不太熟悉,遇到了两问题不知道如何解决,现分享出来,希望有高人予以解决。1.设置最大连接数限制没起到作用,即acceptor.setBacklog(60),测试创建了80个连接,都创建成功了,何解?2.应用中客户端每隔几秒给服务器发送请求,服务器查询数据库返回结果。连接过多并且很多线程处于阻塞状态下,线程池不断的创建线程(压力很大啊),业务类中一个方法是synchronized(所有的连接都会调用这个方法),若此方法不设为synchronized则服务器对客户端返回的结果个别是错误的(不定时不限连接)。这个如何解决?jprofiler截图如下: 30~40个连接时:开到80个连接时,线程池中有1000多个线程:mina服务器代码如下:
NioSocketAcceptor acceptor = null;
try {
//工作主线程   
         acceptor = new NioSocketAcceptor(10);
         
// 设置过滤器
acceptor.getFilterChain().addLast("codec",
new ProtocolCodecFilter(new MyMessageCodecFactory(
new MyMessageDecoder(Charset.forName("utf-8")),
new MyMessageEncoder(Charset.forName("utf-8")))));

//建立线程池
       // java.util.concurrent.Executor threadPool = Executors.newFixedThreadPool(60);
         java.util.concurrent.Executor threadPool = Executors.newCachedThreadPool();
        //加入过滤器(Filter)到Acceptor         
        acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(threadPool));

// 设置读取数据的缓冲区大小
acceptor.getSessionConfig().setReadBufferSize(1024);
// 读写通道无操作进入空闲状态
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 60*60*10);
//设置输出缓冲区的大小
acceptor.getSessionConfig().setSendBufferSize(3000);  

//设置为非延迟发送,为true则不组装成大包发送,收到东西马上发出         
acceptor.getSessionConfig().setTcpNoDelay(true);  
//设置主服务监听端口的监听队列的最大值为60,如果当前已经有60个连接,再新的连接来将被服务器拒绝         
acceptor.setBacklog(60);  
// 绑定逻辑处理器
acceptor.setHandler(new ServerHandler(transaction));
// 绑定端口
acceptor.bind(new InetSocketAddress(Integer.parseInt(port)));
logger.info("服务端启动成功...     端口号为:" + port);
} catch (Exception e) {
logger.error("服务端启动异常....", e);
}

解决方案 »

  1.   

    根据程序运行,每条线程都调用了同一个业务类这样造成的数据可视化太麻烦了。mina中可否每条线程都自己实例一个业务类?各种用各自的干扰会小一些。
      

  2.   

    设置主服务监听端口的监听队列的最大值为60,如果当前已经有60个连接,再新的连接来将被服务器拒绝         
    acceptor.setBacklog(60);  
    谁能解释下为什么这个设置不管用?正确分全给了
      

  3.   

      /** 
         * Define the number of socket that can wait to be accepted. Default
         * to 50 (as in the SocketServer default).
         */
        private int backlog = 50;
    源码上的注释是这样说的,这里不是说只能创建50个连接。
    传入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数。如果队列满时收到连接指示,则拒绝该连接。