2014-10-07 1 views
3

나는 Scala를 사용하여 PostgreSQL 데이터베이스를 쿼리하기 위해 jOOQ 3.4.2를 사용하고 있습니다. 쿼리가 많은 행을 반환 할 수 있으므로 메모리에 전체 결과 집합을로드하지 않고 한 번에 결과 집합의 작은 덩어리를 가져 오려고합니다. 내가 fetchLazy()를 호출 할 때 나는 심지어 첫 번째 가져 오기 전에,jOOQ의 fetchLazy()가 정말로 게으른가요?

val query = context.selectFrom(table) 
        .where(conditions) 
        .orderBy(orderField) 
        .fetchSize(1) 
val cursor = query.fetchLazy() 
// Iterate through cursor using cursor.fetchOne() 

jOOQ이 전체 결과 세트를로드 할 것으로 보인다 (또는 결과 세트의 적어도 엄청난 양의) 메모리 : 나는 다음과 같은 코드가 있습니다 (fetchLazy()이 호출되는 동안보고있는 많은 수의 recvfrom() 시스템 호출로 판단). 내가 뭔가 잘못하고 있는거야?

답변

2

내가 잘못 했나요?

jOOQ 쪽이 아닙니다. 이는 정확히과 Cursor.fetchOne()을 통한 jOOQ와 PreparedStatement.setFetchSize()으로 변환되는 ResultQuery.fetchSize()을 통한 JDBC 드라이버가 한 번에 정확히 한 행을 가져 오도록하는 방법입니다.

그러나 fetchSize이 작동하려면 명시적인 트랜잭션으로 쿼리를 실행해야한다는 메시지가 표시되어 this PostgreSQL JDBC driver caveat으로 실행되었을 수 있습니다.

+0

필자가 아는 한, postgresql의 게으른 쿼리는 진정으로 게으른 트랜잭션을 위해 실행되어야합니다. Postgresql jdbc 드라이버는 서버 쪽 커서를 사용하며 트랜잭션에서만 작동합니다. –

+0

@AndreyAntukh : 예, 스택 오버플로 관련 질문에이 질문이 나와 있습니다. 내 대답을 빨리 업데이트 해 드리겠습니다. –

관련 문제