2017-01-16 1 views
0
public class CassandraData { 

    private static Session cassandraSession = null; 
    private static Cluster cluster = null; 

    CassandraData() { 
     // Do nothing 
    } 

    static { 

     if (cassandraSession == null) { 
      QueryOptions qs = new QueryOptions().setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM); 

      PoolingOptions poolingOptions = new PoolingOptions(); 
      poolingOptions.setConnectionsPerHost(HostDistance.LOCAL, 2, 10).setConnectionsPerHost(HostDistance.REMOTE, 
        10, 20); 

      SocketOptions socketOptions = new SocketOptions(); 
      socketOptions.setConnectTimeoutMillis(60000); 
      socketOptions.setReadTimeoutMillis(600000); 

      cluster = Cluster.builder().addContactPoints("***.***.***.***").withQueryOptions(qs) 
        .withPoolingOptions(poolingOptions).withSocketOptions(socketOptions) 
        .withLoadBalancingPolicy(new RoundRobinPolicy()).build(); 

      cassandraSession = cluster.connect("sf"); 
     } 
     // monitor(); 
    } 

    public Session getSession() { 

     return cassandraSession; 

    } 
    public Data findOne(PK pk) { 

     Data mc = null; 

     Statement statement = new SimpleStatement(getCqlString(pk)); 

     ResultSet results = getSession().execute(statement); 


     List<Row> rowList = results.all(); 

     if (rowList != null && rowList.size() > 0) { 
      Row row = rowList.get(0); 
      mc = EntityConvert.ConvertToMC(row); 
     } 

     return mc; 
    } 
} 
    private String getCqlString(PK pk) { 
    String cqlStr = "select * from table" + " where E='" 
      + pk.E + "' and D=" + pk.D + " and M=" 
      + pk.M; 
    return cqlStr; 
} 

서블릿 :다른 클라이언트의 여러 동시 요청을 처리하기 위해 프로그래밍하는 방법은 무엇입니까?

내 서블릿 응용 프로그램에서
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); 
    } 

} 

, 나는 카산드라에 액세스 할 수 위의 코드를 사용하고 싶습니다. 사용자가 서블릿에 액세스하면 평균 0.1 초가 걸려 데이터를 가져옵니다. 60과 같이 여러 사용자가 서블릿에 액세스 할 때 각 요청은 평균 20 초가 걸려 데이터를 가져옵니다.
여러 사용자로 인해 요청 시간을 줄이려면이 코드를 어떻게 수정해야합니까?

+0

* 60과 같이 여러 사용자가 서블릿에 액세스 할 때 각 요청에 평균 20 초가 소요됩니다. * 결론에 도달 한 방법은 무엇입니까? – shmosel

+1

Jmeter를 사용하여이 서블릿을 테스트했으며 로그 파일에서 쿼리 시간을 보았습니다. – niaomingjian

답변

0
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; 
} 

나는 Prepared statements를 사용하여 20 회 이상 성능을 향상 시켰습니다. 준비된 문을 사용하여

Prepared statements

여러 이점을 제공합니다. 준비된 문장이 파싱되어 Cassandra 노드에서 준비되므로 향후 실행 준비가 완료됩니다. 매개 변수 바인딩시, 이들 (및 쿼리 ID)만이 유선을 통해 전송됩니다. 이러한 성능 향상은 반복적으로 동일한 쿼리를 다른 매개 변수와 함께 사용할 때 합산됩니다.

준비된 문 사용 규칙은 간단합니다. 한 번 준비하고, 여러 번 바인딩하고 실행하십시오.

관련 문제