servlet 3.0异步处理并发测试的疑问

好吧,写这篇文章是为求教。
行里要上线的一个信用卡积分兑换网站已经开发完毕了,由于我们行的信用卡用户不多大约15000左右,所以给定的系统并发要求是300即可。这个通过编写并发测试案例,已经达到要求。
但闲来无事,能不能在现有硬件以及架构的情况下,进一步提供系统的并发能力呢?
之前关注过servlet3.0的异步处理特性。所以我针对系统中的一个核心的交易做了异步调用的改写,通过与原有的写法做并发测试对比,结果。。。 :cry:
不使用新特性,直接用原来的一个线程内处理业务逻辑的方式,最大并发能达到900+
采用新的异步特性后,最大并发只能达到700+
我的测试环境:
OS: win 7
CPU i5 4core
内存:4G
服务器:直接在tomcat 7上测试,没有使用apache
测试工具:JMeter
测试交易:单笔兑换交易
tomcat参数设置:

maxThreads="900" minSpareThreads="150" />
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
processorCache="2000"
acceptCount="1000" URIEncoding="GBK" useBodyEncodingForURI="true"/>

Java代码:
未采用servlet3.0特性,同步处理

public class PointTransAction extends Action{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
//这里做了一些业务逻辑,包括连接数据库调用存储过程,日志,向前台返回xml格式的数据等。
}

使用异步处理特性:

public class PointsExchangeAction extends Action{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
AsyncContext context = request.startAsync();
context.setTimeout(20000);
new Thread(new PointsExchangeExecutor(context)).start();

return null;
}
}

public abstract class Executor implements Runnable{
private AsyncContext asyncCtx = null;
public Executor(AsyncContext ctx){
this.asyncCtx = ctx;
}
@Override
public void run() {
try{
execute((HttpServletRequest)asyncCtx.getRequest(),(HttpServletResponse)asyncCtx.getResponse());
asyncCtx.complete();
}catch(Exception e){
e.printStackTrace();
}
}
public abstract void execute(HttpServletRequest req,HttpServletResponse res);
}

public class PointsExchangeExecutor extends Executor{
public PointsExchangeExecutor(AsyncContext ctx){
super(ctx);
}

@Override
public void execute(HttpServletRequest req, HttpServletResponse res) {
//这里做了一些业务逻辑,包括连接数据库调用存储过程,日志,向前台返回xml格式的数据等。
}
}


附件中是两种方式做并发测试结果的截图


后记:这个问题找到了原因,下面文章中会分析。http://grayrabbit.iteye.com/blog/1422684

你可能感兴趣的:(J2EE,servlet,3.0,tomcat,异步)