2014-04-29 13 views
2

Dapper가 DB 연결을 처리하는 방법과 DB 연결이 제대로 처리되지 않는 이유를 이해하는 데 도움이 필요합니다. 가능한 여러 가지 경우를 코딩했습니다. 내 코드에서는 _connection이 null인지 확인하고 이에 따라 새 연결을 만드는 중입니다. 요청을 진행할 때, 나는 때때로 연결이 열려 있다는 것을 알게되고, 연결 문자열이 객체에 없다는 것을 발견하면 (사용할 수 없게 만들지 만 NULL로 설정하지 않는다는 것을 발견한다). 나는이 사건들을 적절히 다루고 있지만, 비록 클라이언트의 코드가 명시 적으로 을 구현하여 문을 사용하여 코드를 감싸고 있음에도 불구하고 왜 이러한 연결이 이러한 다양한 상태를 가지는지 이해하고 싶습니다. ADO.net에서 연결을 처리하고 있습니까? Dapper의 부작용이 있거나 코드에 문제가 있습니까?Dapper가 사용하는 DB 연결의 비정상적인 동작을 이해하려고 시도합니다.

연결 관리 코드

public class DatabaseContext : IDatabaseContext 
{ 
    private readonly string _connectionString; 

    private DbConnection _connection; 


    public DatabaseContext(string connectionString) 
    { 
     _connectionString = connectionString; 

    } 

    public IDbConnection Connection 
    { 
     get 
     { 

      if (_connection == null) 
       _connection = new SqlConnection(_connectionString); 

      if (string.IsNullOrEmpty(_connection.ConnectionString)) 
       _connection.ConnectionString = _connectionString; 

      if (_connection.State != ConnectionState.Open) 
       _connection.Open(); 

      return _connection; 
     } 
    } 
} 

클라이언트 코드

public IEnumerable<PostSearResults> Search(SearchPostsBy searchPostsBy) 
{ 
    DynamicParameters param; 
    var sql = GetSearchSql(searchPostsBy,out param);//Gets SQL 

    using (var connection = _databaseContext.Connection) 
    { 
     var posts = connection.Query<PostSearResults>(sql, param); 
     return posts.ToList(); 
    } 
} 
+0

왜 코드를 작성하는지 알 수 없습니까?! 왜 그걸 썼지? Btw 코드 리뷰가 주제가 아닙니다. codereview.stackexchange.com에 질문을 게시해야합니다. – MikeSW

+0

@MikeSW 클라이언트 코드가 명령문을 사용하여 DBConnection을 래핑하는 경우에도 DBConnection이 제대로 처리되지 않는 이유를 알고 싶습니다. 뭔가가 그걸 붙잡고있다. ADO.net에서 연결을 처리하고 있습니까? Dapper의 부작용이 있거나 코드에 문제가 있습니까? 이러한 세 가지 가능성으로, 단지 검토 문제 일 수 있습니까? 이슈보다 나에게 논평하는 이유는 무엇입니까? – Yogiraj

+0

코드가하는 일에 대한 설명을 쓰는 대신이 질문을해야합니다. 연결을 다시 사용하려면 연결을 닫지 말고 닫아야합니다. Disposing은 SqlConnection을 다시 설정하고 '이미 삭제 된 개체'또는 비슷한 것을 던질 것입니다 – MikeSW

답변

2

나뿐만 아니라 웹 응용 프로그램에서 단정을 사용하고 난 당신과 비슷한 DapperContext을 구현,하지만 난 IDispose 구현 다음과 같이 수업에 :

#region IDisposable 

    private bool disposed = false; 

    protected virtual void Dispose(bool disposing) 
    { 
     if (!this.disposed) 
     { 
      if (disposing) 
      { 
       if (transaction != null) 
       { transaction.Dispose(); } 
       if (cn != null) 
       { cn.Dispose(); } 
      } 
     } 
     this.disposed = true; 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    #endregion 

Dapper의 내 버전은 전화를 걸면 닫히고, 쿼리를 실행 한 후 닫습니다. 전화를 걸면 연결이 열리면 Dapper가 쿼리를 실행하고 연결이 열렸습니다.

또한 DI를 사용하므로 내 DapperContext 수명이 DI 컨테이너에 의해 관리되므로 웹 요청 컨텍스트가 종료되고 삭제 될 때 폐기됩니다. 그것은 매우 안정되어 왔으며 내가 어떤 이상한 행동이없는 GetPE

private readonly IDbConnection context; 
private readonly DapperContext dapperContext; 

public SFRepository(DapperContext dbContext) 
{ 
    dapperContext = dbContext; 
    context = dbContext.Connection; 
} 

public PEData GetPE(int peID) 
{ 
    PEData rec = context.Query<PEData>("SELECT * FROM PEDATA WHERE ID= @ID", new { ID = peID }).FirstOrDefault(); 

    return rec; 
} 

내 단정 한 저장소는 샘플 방법으로, 다음과 같다.