2016-11-11 3 views
3

를 이행되지 않습니다, 그래서 같이 fetchSize를 설정합니다카산드라 .setFetchSize() 문에 나는 UI에 페이지 매김을 구현하려는

boundStatement.setFetchSize(20) 

그러나의 setFetchSize()가 이행되지 않습니다. 내 테이블에 지금 400 행이 있고 모든 400 행이 검색됩니다.

rs.getExecutionInfo().getPagingState(); 

을 사용하여 다음 행 세트를 검색하면 다음 380 행이 검색됩니다.

.... 
.... 

// "SELECT * FROM abc.sometable" 
BoundStatement boundStatement = pStmt.bind(); 
boundStatement.setFetchSize(20); 

if (pagingState != null) { 
    boundStatement.setPagingState(PagingState.fromString(pagingState)); 
} 
ResultSet rs = session.execute(boundStatement); 
PagingState nextPage = rs.getExecutionInfo().getPagingState(); 
int remaining = rs.getAvailableWithoutFetching(); 
List<?> list = new ArrayList<>(); 
for (Row row : rs) { 
    list.add(getValidObjectFromRow(row)); 
} 
.... 

카산드라 : 그래서 페이징 상태가 올바르게 설정 및 검색, 그런데 왜 테이블에서 모든 400 개 행을 불러 오는 드라이버입니다 나는이 문제를 피하거나 할 수있는 방법은 코드의 400

부분을 검색 버전 - 3.7 및 카산드라 드라이버 버전 - 3.1.0

고마워!

+0

ResultSet을 어떻게 소비하고 있습니까? 운전자가 표지 아래에서 다음 20 개의 열을 페이징 (paging) 할 수 있습니다. –

+0

wireshark를 사용하면 쿼리/결과를보고 실제로 20 개의 청크로 가져 오는 지 확인할 수 있습니다. 더 많은 제어가 필요한 경우 쿼리에'LIMIT 20 '을 추가하고 수동으로 페이지를 추가하고자 할 수 있습니다. –

+0

코드 블록으로 질문을 업데이트했습니다. – user1860447

답변

4

setFetchSize은 페이지 크기를 제어하지만 ResultSet에 반환되는 최대 행은 제어하지 않습니다. 샘플 코드에서 위의 코드에서

for (Row row : rs) { 
    list.add(getValidObjectFromRow(row)); 
} 

, 그것은 처음 20 행을 반복하며, 그것은 현재의 결과의 끝에 도달하면 더 이상 행이 쿼리와 일치하지 않을 때까지, 그것은 더 가져옵니다.

반환되는 행 수를 제한하려면 몇 가지 옵션이 있습니다.

  1. LIMIT X (x는 원하는 행 수) 쿼리 끝에 추가하십시오. 행이 더 이상 없을 때까지
while(rs.getAvailableWithoutFetching() > 0) { 
    list.add(getValidObjectFromRow(rs.one())); 
} 

그것을 반복하는 중지됩니다 지적하는 페이지에 더 이상의 행이 없을 때까지이는 ResultSet에서 읽습니다 :, 즉를 반복.

+1

감사합니다. 나는 다시 돌아가서 자바 드라이버 문서를 다시 읽고 당신의 응답은 그들에게 새로운 의미를 부여했다! LOL :) – user1860447