Dapper dot net에서 버퍼링 된 매개 변수는 무엇을합니까?

.net dapper sqldatareader

문제

Dapper dot net에는 buffer 매개 변수 (bool)가 있지만, 반환 할 값을 목록에 캐스트하는 것만 알 수 있습니다.

문서에 따라 :

Dapper의 기본 동작은 SQL을 실행하고 반환시 전체 판독기를 버퍼링하는 것입니다. 이것은 db의 공유 잠금을 최소화하고 db 네트워크 시간을 줄이기 때문에 대부분의 경우 이상적입니다.

그러나 거대한 쿼리를 실행할 때 메모리 풋 프린트를 최소화하고 필요할 때만 객체를로드해야 할 수도 있습니다. 이렇게하려면 query 메서드에 buffered : false를 전달합니다.

목록에 결과를 캐스팅하는 것이 어떻게 달성되는지 잘 모르겠습니다. 내가 놓친 게 있니? 내 유일한 생각은 설정하도록되어 있다는 것입니다 CommandBehaviorExecuteReaderCommandBehavior.SequentialAccess (하지만하지 않습니다).

수락 된 답변

그러나 내가 할 수있는 유일한 것은 그것을 돌려 보내기 전에 그 결과를리스트에 던지라는 것이다.

너는 아무것도 놓치지 않았다. 그것이 바로 주요 차이점입니다. 그것은 캐스트 와 같은 것이 아니라는 점을 제외하면 실제로 반환되는 객체는 매우 다릅니다. 기본적으로 데이터를 읽는 두 가지 방법이 있습니다.

  • 스트리밍 API에서 각 요소는 개별적으로 산출됩니다. 이것은 매우 효율적인 메모리이지만 항목 당 많은 후속 처리를 수행하면 연결 / 명령이 장시간 "활성"상태가 될 수 있습니다
  • 버퍼링 된 API에서 모든 행이 생성 되기 전에 읽혀집니다.

아주 많은 양의 데이터 (수천에서 수백만 행)를 읽는다면 버퍼되지 않은 API가 더 좋습니다. 그렇지 않으면 많은 메모리가 사용되며 첫 번째 행이 가능하기 전에 눈에 띄는 대기 시간이있을 수 있습니다. 그러나 대부분의 일반적인 시나리오에서 읽는 데이터의 양은 합리적인 한도 내이므로 호출자에게 전달하기 전에 목록으로 밀어 넣는 것이 합리적입니다. 이는 명령 / 판독기 등이 완료 되기 전에 완료되었음을 의미합니다.

부수적으로, 버퍼링 된 모드는 오 - 너무 일반적인 "연결에 이미 열려있는 독자가있다"(또는 정확한 표현이 무엇이든간에) 피합니다.


인기 답변

나는 이것에 대해 @ chris-marisic에 동의하지 data.ToList() . 버퍼 된 것을 사용할 때 정확한 라인 ( data.ToList() )에서 여러 개의 "Out Of Memory"예외가 발생했다. 그것은 "열 x 행 수십억 열"쿼리, 약 5-6k 행의 SQL- 결과로 약 30 개의 열만있었습니다.

실제로 구성에 따라 다릅니다. 귀하의 SQL과 IIS가 같은 물리적 기계에서 실행되는지 여부. 그리고 IIS 컴퓨터에 설치된 메모리의 양과 페이지 파일 설정 등은 웹 서버의 크기가 2GB 이하인 경우 매우 무거운 보고서의 경우 "buffered : false"로 설정하십시오.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.