Wie in Dapper-Dokumenten erwähnt , verwendet Dapper ein ConcurrentDictionary
, um eigene Caches mit Informationen über die ausgeführten Abfragen zu speichern.
Dapper speichert Informationen über jede Abfrage, die es ausführt, damit es Objekte schnell materialisieren und Parameter schnell verarbeiten kann. Die aktuelle Implementierung speichert diese Informationen in einem
ConcurrentDictionary
Objekt zwischen. Anweisungen, die nur einmal verwendet werden, werden routinemäßig aus diesem Cache gelöscht. Wenn Sie jedoch SQL-Strings im laufenden Betrieb generieren, ohne Parameter zu verwenden, können Speicherprobleme auftreten .
Gibt es eine Möglichkeit, einige SQL-Abfragen auszuführen, so dass sie explizit nicht von Dapper zwischengespeichert werden?
Ich habe einige Abfragen, die sehr dynamisch zusammengestellt sind, verwenden temporäre Tabellen mit zufälligen Bezeichnern, Parameter in der Zeichenfolge usw. Ich denke, es wäre eine gute Idee, diese ohne Cache auszuführen. Ich weiß, dass die ideale Lösung darin bestünde, die Abfragen besser zu schreiben , aber ich suche hier nach einer kurzfristigen Lösung, während ich einige Leistungsprobleme diagnostiziere. Eines der Dinge, die ich sehe, ist, dass der von Dapper zugewiesene ConcurrentDictionary
Speicher mit der Zeit wächst und nicht freigegeben wird. Ich möchte einige Dinge ausprobieren, um es unter Kontrolle zu bekommen, ohne viel Code neu schreiben zu müssen.
So etwas ist in Dapper möglich; nur um ausgewählte Abfragen so auszuführen, dass sie nicht im Cache landen?
Nachdem ich hier keine Antworten bekommen hatte, fragte ich erneut nach Github-Problemen und erhielt diese Antwort von Marc Gravell:
Ja, aber jetzt ist der einzige Weg , das zu tun ist über
CommandDefinition
, zum Beispiel:var cmdDef = new CommandDefinition("select ... blah ...", new { a, b }, commandType: CommandType.Text, flags: CommandFlags.NoCache);Das wichtige Bit hier ist der
CommandFlags.NoCache
. Es gibt ähnlicheQuery
Methoden, dieCommandDefinition
.