dapper.net, ConcurrentDictionary를 플러시하는 방법?

concurrentdictionary dapper

문제

나는 새로운 프로젝트에이 프로젝트를 사용하기가 어렵다. 그것을 읽은 후, 내가 가질 수있는 유일한 문제는 ConcurrentDictionary 인 것 같다.

Dapper는 실행되는 모든 쿼리에 대한 정보를 캐시하므로 개체를 신속하게 구체화하고 매개 변수를 빠르게 처리 할 수 ​​있습니다. 현재의 구현은,이 정보를 ConcurrentDictionary 오브젝트에 캐쉬합니다. 저장하는 객체는 절대 플러시되지 않습니다. 매개 변수를 사용하지 않고 즉시 SQL 문자열을 생성하는 경우 메모리 문제가 발생할 수 있습니다. 사전을 LRU 캐시로 변환 할 수 있습니다.

이 문제를 어떻게 피할 수 있습니까? 누군가가 내게 어떤 코드를 보여 주시겠습니까 방법과 언제 그것을 플러시 말해 줄래?

수락 된 답변

의견 위로 가기, 여기에 예가 바로 있습니다 :

var builder = new StringBuilder();
builder.AppendLine("SELECT Foo FROM Bar");
if (fisrtName != null || lastName != null)
    builder.AppendLine("WHERE");
if (firstName != null)
    builder.AppendLine("    Bar.FirstName = @Firstname");
if (firstName != null && lastName != null)
    builder.Append(" AND");
if (lastName != null)
    builder.AppendLine("    Bar.LastName = @LastName");
var sql = builder.ToString();

보시다시피, 이제 dapper가 실행할 실제 SQL은 firstName 및 / 또는 lastName 이 null인지 여부에 따라 달라집니다. 둘 다 null이면 하나의 SQL 문자열을 얻습니다. firstName 만이 널 (NULL)이 아니면, 다른 것을 얻습니다. lastName 만이 null이 아니면, 또 다른 것을 얻습니다. 마지막으로, 둘 다 null이 아니면 네 번째 순열을 얻습니다.

이것은 "온더 플라이 (on-the-fly)"가 의미하는 것입니다. - dapper는 이러한 고유 한 순열을 기반으로 캐시 할 것이고 더 복잡한 시나리오가 주어지면 많은 다른 순열로 끝나는 방법을 쉽게 알 수 있습니다. 그 중 일부는 독립적으로 캐시되어야합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow