Java 如何编程来处理来自不同客户端的多个同时请求?

Java 如何编程来处理来自不同客户端的多个同时请求?,java,servlets,cassandra,Java,Servlets,Cassandra,在我的Servlet应用程序中,我想使用上面的代码访问cassandra。 当用户访问Servlet时,获取数据平均需要0.1秒。 当多个用户(如60个)访问Servlet时,每个请求平均需要20秒才能获取数据。 由于有多个用户,我应该如何修改此代码以减少重新请求时间 public class OneServlet extends HttpServlet { private static final long serialVersionUID = 1L; private stat

在我的Servlet应用程序中,我想使用上面的代码访问cassandra。 当用户访问Servlet时,获取数据平均需要0.1秒。 当多个用户(如60个)访问Servlet时,每个请求平均需要20秒才能获取数据。
由于有多个用户,我应该如何修改此代码以减少重新请求时间

public class OneServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final Logger logger = LogManager.getLogger(OneServlet.class);
    /**
     * @see HttpServlet#HttpServlet()
     */
    public OneServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("application/json; charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        long start = System.currentTimeMillis();

        PK pk = ValidData.getOnePk();

        CassandraData dataAccess = new CassandraData();
        long end2 = System.currentTimeMillis();
        Data mc = dataAccess.findOne(pk);

        String rsJson = JSON.toJSONString(mc);
        long end = System.currentTimeMillis();

        logger.info("Create CassandraData:" + (end2 - start)/1000.0 +"s elapsed." + "Show One:" + (end - start)/1000.0 +"s elapsed.");

        OutputStream out = response.getOutputStream();
        out.write(rsJson.getBytes("UTF-8"));
        out.flush();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
我使用事先准备好的语句,将性能提高了20多次

使用预先准备好的报表有多种好处。在Cassandra节点上解析并准备一个prepared语句,以便将来执行。绑定参数时,只有这些参数(以及查询id)通过线路发送。当重复使用相同的查询(使用不同的参数)时,这些性能增益将累积起来

记住,使用prepared语句的规则很简单:准备一次,绑定并执行多次


当多个用户(如60个)访问Servlet时,每个请求平均需要20秒才能获取数据。您是如何得出这个结论的?我使用Jmeter测试了这个Servlet,并在日志文件中看到了查询时间。
public class OneServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final Logger logger = LogManager.getLogger(OneServlet.class);
    /**
     * @see HttpServlet#HttpServlet()
     */
    public OneServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("application/json; charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        long start = System.currentTimeMillis();

        PK pk = ValidData.getOnePk();

        CassandraData dataAccess = new CassandraData();
        long end2 = System.currentTimeMillis();
        Data mc = dataAccess.findOne(pk);

        String rsJson = JSON.toJSONString(mc);
        long end = System.currentTimeMillis();

        logger.info("Create CassandraData:" + (end2 - start)/1000.0 +"s elapsed." + "Show One:" + (end - start)/1000.0 +"s elapsed.");

        OutputStream out = response.getOutputStream();
        out.write(rsJson.getBytes("UTF-8"));
        out.flush();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
private Select getCqlSelect(PK pk) {

    Select select = QueryBuilder.select().from("table");
    select.where(QueryBuilder.eq("E", pk.E))
            .and(QueryBuilder.eq("D", pk.D))
            .and(QueryBuilder.eq("M", pk.M)).limit(1)

    return select;
}