最近用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);
}
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);
}
解决方案 »
- Exception in thread "main" org.hibernate.HibernateException: /hibernate.cfg.xml
- 动态显示数据库图片?
- 我的servlet为什么不能运行
- 遇到点问题,请高手指教`~~~
- 输入问题?
- jsp include 重复文件问题
- [新人][急救][高分]eclipse(V3.4.1)如何打开"Tomcat 6.0\webapps\struts2-rest-showcase-2.1.6"这个struts示例。
- 请问jsp里如何判断select sum(XX) from .....返回的不是int类型而是null呢?
- 关于jsp中import自己的写的类的问题
- 之前还好好的,Tomcat突然出现这问题
- 给boolean赋值为何会出现空指针?
- 原tomcat下的web应用在发布到websphere后报500错误
acceptor.setBacklog(60);
谁能解释下为什么这个设置不管用?正确分全给了
* 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 参数。如果队列满时收到连接指示,则拒绝该连接。