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 초가 걸려 데이터를 가져옵니다.
여러 사용자로 인해 요청 시간을 줄이려면이 코드를 어떻게 수정해야합니까?
* 60과 같이 여러 사용자가 서블릿에 액세스 할 때 각 요청에 평균 20 초가 소요됩니다. * 결론에 도달 한 방법은 무엇입니까? – shmosel
Jmeter를 사용하여이 서블릿을 테스트했으며 로그 파일에서 쿼리 시간을 보았습니다. – niaomingjian