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