티스토리 뷰
📖 Real MySQL 책 내용 발췌...
스트리밍 방식
서버 쪽에서 처리해야 할 데이터가 얼마나 될지에 관계없이 조건에 일치하는 레코드가 검색될 때마다 바로바로 클라이언트로 전송해주는 방식. 클라는 쿼리 요청 후 곧바로 첫번째 레코드를 전달 받음. 마지막 레코드를 받는 시점은 알 수 없음. 클라이언트는 바로 데이터 가공 시작할 수 있음.
레코드 수에 상관 없이 빠른 응답 시간 보장 가능.
💡 클라이언트 도구, API에 따라 스트리밍 처리 방식이 다를 수 있음
JDBC => mysql 서버는 레코드를 읽자마자 클라이언트로 그 결과를 전달할 것이지만, JDBC가 mysql 서버로부터 받는 레코드를 일단 자체적인 버퍼에 모두 담아 두고, 마지막 레코드가 전달되면 그 때서야 비로소 클라이언트 어플리케이션에 반환함.
즉, mysql 서버는 스트리밍 방식으로 처리해서 반환하지만 클라이언트의 JDBC 라이브러리가 버퍼링을 함.
( 불필요한 네트워크 요청이 최소화되기 때문에 전체 throughput이 좋아서 이 방식을 채택하는 것이라고 함)
default 설정이 그렇다는 거고 767p 참고하면 JDBC에서도 스트리밍 방식으로 가져올 수도 있는 듯?
- Statement.setFetchSize(Integer.MIN_VALUE) 설정 => mysql서버에서 결과 레코드가 아닌 ResultSet이라는 핸들러를 내려주면, 클라이언트 단의 ResultSet.next() 함수 호출 될때마다 한 건씩 클라이언트로 내려보냄 (statement 수준의 옵션)
- 서버 커서. mysql 서버에 결과 셋에 상응하는 크기의 임시 테이블 생성. ( 커넥션 생성할 때 JDBC url 옵션에 설정 )
버퍼링 방식
order by, group by 같은 처리는 쿼리 결과가 스트리밍 되는 것을 불가능하게 함.
우선 스토리지에서 일치하는 모든 레코드를 가져온 후, mysql 서버에서 정렬 & 그루핑을 마친 후 (일괄 가공) 클라이언트에 보내야 하기 때문.
이 후처리를 하는 동안 client는 계속 기다려야 함. 응답 속도가 느려짐.
'시리즈 > Stream Processing' 카테고리의 다른 글
이벤트 스트림 parallel processing (kafka, kinesis, axon) (1) | 2023.11.19 |
---|---|
Kinesis Lease (1) | 2023.11.19 |
kafka rebalancing (1) | 2023.11.19 |
iterable, iterator 그리고 generator (0) | 2022.08.08 |
iterator 패턴 (0) | 2022.07.31 |