2012-05-04 2 views
0

나는 새로운 프로젝트에이 프로젝트를 사용하기에 새롭다. 그것을 읽은 후, 내가 가질 수있는 유일한 문제는 ConcurrentDictionary 인 것 같다.dapper.net, 어떻게 ConcurrentDictionary를 플러시합니까?

Dapper 캐시는 실행되는 모든 쿼리에 대한 정보를 제공하므로 개체를 신속하게 구체화하고 매개 변수를 신속하게 처리 할 수 ​​있습니다. 현재 구현 은이 정보를 ConcurrentDictionary 오브젝트에 캐시합니다. 객체가 저장되지 않습니다. 매개 변수를 사용하지 않고 파리에서 SQL 문자열을 생성하면 메모리에 도달 할 수 있습니다. 문제. 사전을 LRU 캐시로 변환 할 수 있습니다.

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

+0

그래서 SQL 문자열을 즉석에서 생성하고 있습니까? –

+0

"SQL 문자열을 즉시 생성하는"것은 무엇을 의미합니까? 예를 들어 주시겠습니까? – qinking126

+0

SQL 문자열 - 동적으로'StringBuilder'를 사용하여 구축하고 있습니까? 아니면'var sql = @ "처럼 선언 된 상수 문자열일까요? SELECT Foo FROM Bar"'? –

답변

2

, 여기의 예에 - 더 - 플라이 : 당신이 볼 수 있듯이

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(); 

것은, 지금 실행 날씬한 실제 SQL이 있는지 여부 firstName과에 따라 다를 수 있습니다/또는 lastName은 null입니다. 둘 다 null이면 하나의 SQL 문자열을 얻습니다. firstName만이 널이 아닌 경우, 다른 것을 얻습니다. lastName만이 널이 아니면, 또 다른 것을 얻습니다. 마지막으로, 둘 다 null이 아니면 네 번째 순열을 얻습니다.

이것은 "온더 플라이 (on-the-fly)"의 의미입니다.이 독특한 순열을 기반으로 캐시됩니다. 더 복잡한 시나리오가 주어지면 많은 사람들이 어떻게 될지 쉽게 볼 수 있습니다. 다른 순열은 모두 독립적으로 캐시되어야합니다.

+0

죄송합니다. 마지막 질문이 하나 있습니다. 이름의 값을 변경하면 전에 게시 한 쿼리 새로운 순열인가? 쿼리가 너무 많아서 ConcurrentDictionary를 플러시 할 필요가 있는지 확인하는 방법이 있습니까? – qinking126

+0

''Name = @ Name'과 같은 플레이스 홀더를 사용할 때 패스하는 값을 변경하면 (예 :'new {Name = new DbString {Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true})')는 완벽하게 멋지 며 정확하게 dapper가 사용되는 방법입니다. –

관련 문제