Dapper dot netでバッファされたパラメータは何をするのですか?

.net dapper sqldatareader

質問

Dapper dot netはbufferパラメータ(ブール値)を持っていますが、それを返すことができる唯一のことを言えばそれを返す前にリストに結果をキャストすることです。

ドキュメントに従って:

Dapperのデフォルトの振る舞いはあなたのsqlを実行し、戻ったときに全体の読者をバッファすることです。これは、db内の共有ロックを最小限に抑え、dbネットワーク時間を短縮するため、ほとんどの場合理想的です。

ただし、巨大なクエリを実行するときは、メモリ使用量を最小限に抑え、必要に応じてオブジェクトのみをロードする必要があります。そのためには、buffered:Queryメソッドにfalseを渡します。

結果をリストにキャストすることでこれがどのように達成されるかわかりません。私は何かが足りないのですか?私の唯一のアイデアは、設定することになっているということであるCommandBehaviorためExecuteReaderCommandBehavior.SequentialAccess (しかし、それはしていません)。

受け入れられた回答

しかし、私が唯一のことは、結果をリストにキャストして返すことです

あなたは何も欠けていません。それが重要な違いです。実際に返されるオブジェクトは非常に異なっている:それはのようなキャストではありません除きます。基本的に、データを読み取るには2つの方法があります。

  • ストリーミングAPIでは、各要素が個別に生成されます。これは非常にメモリ効率が良いですが、アイテムごとに後続の処理をたくさん行う場合、接続/コマンドが長時間「アクティブ」になる可能性があります
  • バッファされたAPIで何かが生成される前にすべての行が読み込まれます

非常に大量のデータ(数千から数百万行まで)を読み込んでいる場合は、バッファされていないAPIが望ましいかもしれません。さもなければ、たくさんのメモリが使用され、最初の行が利用可能になる前に顕著な待ち時間があるかもしれません。しかし、ほとんどの一般的なシナリオでは、読み込まれるデータの量は妥当な範囲内であるため、呼び出し元に渡す前にリストにプッシュするのが妥当です。これは、コマンド/リーダーなどが完了する前に返されることを意味します。

さらに、バッファされたモードでは、あまりにも一般的な「接続上に既に開いているリーダーがあります」(または正確なフレーズが何であれ)を避けることができます。


人気のある回答

これについては、私は@ chris-marisicに同意しなければなりません。 バッファリングされた:trueを使用すると、その正確な行( data.ToList() )で複数の "Out Of Memory"例外が発生しました。これは、 "膨大な行×bazillion列"のクエリではなく、通常の5-6k行のSQL結果で、約30列です。

それは実際にあなたの設定に依存します。たとえば、SQLとIISが同じ物理マシン上で実行されているかどうか。 IISマシンにインストールされているメモリ容量とページファイルの設定など.Webサーバーのサイズが2 GB以下の場合は、超重いレポートの場合は "buffered:false"を設定することを検討してください。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ