2011-01-28 3 views
1

나는의의 CommandText를 수정하고있어 LINQ - 투 - SQL은 다음과 같이 NOLOCK을 사용하여 강제로 ... linq-to-sql commandtext를 수정할 때 연결을 닫아야합니까?

if (db.Connection.State == System.Data.ConnectionState.Closed) 
    db.Connection.Open(); 

var cmd = db.GetCommand(db.Customers.Where(p => p.ID == 1)); 

cmd.CommandText = cmd.CommandText.Replace("[Customers] AS [t0]", "[Customers] AS [t0] WITH (NOLOCK)"); 

var results = db.Translate(cmd.ExecuteReader()); 

그것은 데이터 컨텍스트가 기본 컨트롤러 그래서, MVC 응용 프로그램, 그리고 할 수 있습니다

이 코드보다 먼저 사용되었으며, 더 중요한 것은 이후입니다. 이 루틴에서 연결을 종료해야합니까? 아니면 전혀? 아니면 내가 여기 열었을 때만?


업데이트 :

나는 지금의 CommandText를 수정 (DataContext를 클래스에서) 더 일반적인 기능을 사용하고, 여기에 개설 된 경우 연결을 종료하고 있습니다. 그리고 open은 ExecuteReader로 이동되었습니다. 지금까지 그것은 일하고 있으며 산발적 인 교착 상태 문제를 줄였습니다. 결과는 2 등분 할 필요가 없습니다.

public List<T> GetWithNolock<T>(IQueryable<T> query) 
    { 
     // to skip nolock, just... 
     // return query.ToList(); 

     List<T> results = null; 

     bool opened = false; 

     try 
     { 
      if (Connection.State == System.Data.ConnectionState.Closed) 
      { 
       Connection.Open(); 

       opened = true; 
      } 

      using (var cmd = GetCommand(query)) 
      { 
       cmd.CommandText = Regex.Replace(cmd.CommandText, @"((from|inner join) \[dbo.*as \[t\d+\])", "$1 with (nolock)", RegexOptions.IgnoreCase); 

       results = Translate<T>(cmd.ExecuteReader()).ToList(); 
      } 
     } 
     finally 
     { 
      if (opened && Connection.State == System.Data.ConnectionState.Open) 
      { 
       Connection.Close(); 
      } 
     } 

     return results; 
    } 

나는 과거에 트랜잭션을 권장 방법으로 사용하면 사이트의 연결이 밤 사이에 끊어지는 것을 발견했습니다. 내가 아는 한, 그것은 linq-to-SQL의 버그입니다. 그 주위에는 여러 가지 방법이있을 수 있지만 필자의 주요 코드는 간단하게 작성하려고합니다. 이제는 "그냥"해야합니다 ...

var users = GetWithNolock<User>(
    Users 
    .Where(u => my query 
); 

답변

0

당신이 그것을 열어야한다면, 그것을 닫아야합니다. 다른 LinqToSql 작업은이 패턴과 일치합니다.

내 코드에서 무조건 연결을 열고 마지막으로 연결을 닫습니다. 누군가 내게 열린 연결을 전달하면, 그것은 그들의 잘못이고 나는 그들을 위해 그것을 닫습니다.

ExecuteReader 직전까지 연결 열기를 지연시킬 수 있습니다.

관련 문제