質問: 私はデータベースからIEnumerableとしてオブジェクトを返すためにdapperを使います。デフォルトのdapperはバッファ設定をtrueに設定しています。 これはどのように作動しますか? 最初のクエリをdapperでキャッシュし、メモリからオブジェクトを取得する場合。 誰かがテーブルの行を編集/削除/追加するとどうなりますか。このクエリーのためにすべてのデータを再度キャッシュする必要がありますか?
回答: バッファはキャッシュと無関係です。 Dapperはどのような種類のデータキャッシュも含んでいません(コマンドの処理方法に関連するキャッシュを持っていますが、このタイプのパラメータを持つこのコマンド文字列とこのタイプのエンティティには、コマンドを実行してオブジェクトを入力します)。 このスイッチが実際に意味するものは次のとおりです。 * `false` :アイテムが受信/消費されるときにアイテムを反復する - 基本的に、 `IDataReader`周りの反復子ブロック + マイナス:一度しか反復することはできません(クエリを再実行するのがうれしくない限り) + また、一度にすべてのメモリを必要とせずに、 **膨大な**クエリ(何百万もの行)を繰り返し処理することができます。 + データの終わりが反復処理を開始するのを待つ必要はありません。少なくとも1つの行があるとすぐに行えます + マイナス:反復処理中に接続が使用中であるため、行ごとに他のコマンドを呼び出そうとすると「接続先のリーダーが既に開いています」(または正確な言葉が何であれ)エラーが発生する可能性があります(これはMARSによって緩和される) + マイナス:コンシューマはアイテムごとに何かを行うことができるため(1行に数分かかることがあり、何か複雑なことをするとコマンド/リーダーが長く開いている可能性があります) * `true` (デフォルト):データが完全に`List`消費されてから返されます + プラス:好きなだけ何度でも反復することができます + マイナス:クエリが膨大である場合、それらをすべて(リスト内の)メモリにロードすることは、費用がかかります + マイナス:クエリが大きい場合は、最後の行を収集する際に顕著な遅延が発生することがあります + プラス:データを取得すると、コマンドが完了します。その操作とそれに続く操作との間に矛盾はありません + プラス:データを取得するとすぐに、コマンドはすでにすべてのリソース(ロックなど)を解放しているため、サーバーへの影響は最小限に抑えられています ほとんどのクエリでは、適度な量のデータ(たとえば100レコード未満)しか返されないため、ほとんどのシナリオではデフォルト( `true` )が最も適切な動作を提供することができて満足しています。しかし、さまざまな使用シナリオに対応するために、このオプションを利用できるようにしています。