ダッパバッファ/キャッシュの説明

.net caching dapper

質問

私はデータベースからIEnumerableとしてオブジェクトを返すためにdapperを使います。デフォルトのdapperはバッファ設定をtrueに設定しています。

これはどのように作動しますか?

最初のクエリをdapperでキャッシュし、メモリからオブジェクトを取得する場合。

誰かがテーブルの行を編集/削除/追加するとどうなりますか。このクエリーのためにすべてのデータを再度キャッシュする必要がありますか?

受け入れられた回答

バッファはキャッシュと無関係です。 Dapperはどのような種類のデータキャッシュも含んでいません(コマンドの処理方法に関連するキャッシュを持っていますが、このタイプのパラメータを持つこのコマンド文字列とこのタイプのエンティティには、コマンドを実行してオブジェクトを入力します)。

このスイッチが実際に意味するものは次のとおりです。

  • false :アイテムが受信/消費されるときにアイテムを反復する - 基本的に、 IDataReader周りの反復子ブロック
    • マイナス:一度しか反復することはできません(クエリを再実行するのがうれしくない限り)
    • また、一度にすべてのメモリを必要とせずに、 膨大なクエリ(何百万もの行)を繰り返し処理することができます。
    • データの終わりが反復処理を開始するのを待つ必要はありません。少なくとも1つの行があるとすぐに行えます
    • マイナス:反復処理中に接続が使用中であるため、行ごとに他のコマンドを呼び出そうとすると「接続先のリーダーが既に開いています」(または正確な言葉が何であれ)エラーが発生する可能性があります(これはMARSによって緩和される)
    • マイナス:コンシューマはアイテムごとに何かを行うことができるため(1行に数分かかることがあり、何か複雑なことをするとコマンド/リーダーが長く開いている可能性があります)
  • true (デフォルト):データが完全にList<T>消費されてから返されます
    • プラス:好きなだけ何度でも反復することができます
    • マイナス:クエリが膨大である場合、それらをすべて(リスト内の)メモリにロードすることは、費用がかかります
    • マイナス:クエリが大きい場合は、最後の行を収集する際に顕著な遅延が発生することがあります
    • プラス:データを取得すると、コマンドが完了します。その操作とそれに続く操作との間に矛盾はありません
    • プラス:データを取得するとすぐに、コマンドはすでにすべてのリソース(ロックなど)を解放しているため、サーバーへの影響は最小限に抑えられています

ほとんどのクエリでは、適度な量のデータ(たとえば100レコード未満)しか返されないため、ほとんどのシナリオではデフォルト( true )が最も適切な動作を提供することができて満足しています。しかし、さまざまな使用シナリオに対応するために、このオプションを利用できるようにしています。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow