首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > 高性能WEB开发 >

mina框架线程池中自建线程过多即连接限制无效有关问题

2013-03-12 
求助mina框架线程池中自建线程过多即连接限制无效问题最近用mina框架开发一个应用,鉴于本人对mina不太熟悉

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

开到80个连接时,线程池中有1000多个线程:
 
mina框架线程池中自建线程过多即连接限制无效有关问题



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);
 }
 根据程序运行,每条线程都调用了同一个业务类这样造成的数据可视化太麻烦了。mina中可否每条线程都自己实例一个业务类? mina 框架 数据可视化 服务器
[解决办法]
Executors.newCachedThreadPool(); 这个方法就是根据需要来创建线程。过多的请求(每一个请求执行时间较长)处理不了就会增加新的线程。
newFixedThreadPool 就是设置固定线程来处理的,过多的请求(每一个请求执行时间较长)就会导致后续请求延迟非常大。
根据你这种情况,应该将接受到的请求加入到另一个线程池的队列中,由这个线程池来处理这些请求。
  mina执行业务逻辑不应该被查询数据阻塞。所以查询数据必须由其他几个线程来执行。

热点排行