2010-07-31 6 views
3

SqlConnection 개체의 패턴은 어느 것입니까? 어떤 것이 성능면에서 더 낫습니까? 다른 패턴을 제공합니까?SqlConnection 개체에 어떤 패턴이 더 좋습니까?

class DataAccess1 : IDisposable 
{ 
    private SqlConnection connection; 

    public DataAccess1(string connectionString) 
    { 
     connection = new SqlConnection(connectionString); 
    } 

    public void Execute(string query) 
    { 
     using (SqlCommand command = connection.CreateCommand()) 
     { 
      command.CommandText = query; 
      command.CommandType = CommandType.Text; 
      // ... 

      command.Connection.Open(); 
      command.ExecuteNonQuery(); 
      command.Connection.Close(); 
     } 
    } 

    public void Dispose() 
    { 
     connection.Dispose(); 
    } 
} 

VS

class DataAccess2 : IDisposable 
{ 
    private string connectionString; 

    public DataAccess2(string connectionString) 
    { 
     this.connectionString = connectionString; 
    } 

    public void Execute(string query) 
    { 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      SqlCommand command = connection.CreateCommand(); 
      command.CommandText = query; 
      command.CommandType = CommandType.Text; 
      // ... 

      command.Connection.Open(); 
      command.ExecuteNonQuery(); 
      command.Connection.Close(); 
     } 
    } 

    public void Dispose() 
    {    
    } 
} 

답변

1

DataAccess2으로 제안하십시오. 그래도 개인적인 취향이야. 어떤 사람들은 당신의 수업이 static 일 것을 제안합니다. 그 중 하나가 다른 것보다 더 잘 수행된다고 말하는 것은 어려울 것입니다. IDisposable 경로에 있습니다.

위에 제시된 두 가지 스타일을 모두 읽고 계속 유지하면됩니다.

DAL이 값을 생성자에서 전달되도록 독점적으로 허용하는 것이 아니라 .config에서 연결 문자열을 읽을 수있게하는 것이 좋습니다.

public DataAccess2(string connStr) 
{ 
    this.connectionString = connStr; 
} 
public DataAccess2() 
{ 
    this.connectionString = 
      ConfigurationManager.ConnectionStrings["foo"].ConnectionString; 
} 

또한 using에 SqlCommand를 래핑하는 것이 좋습니다.

using (var conn = new SqlConnection(connectionString)) 
{ 
    using(var cmd = conn.CreateCommand()) 
    { 

    } 
} 
+2

나는 권합니다 ... 여러 연결을 사용하는 것을 선호하는 상황이있을 것입니다. 응용 프로그램에서 구성 정보를 읽고이를 소비자에게 전달하십시오. 클래스의 이식성을 제한 할 이유가 없습니다. –

+0

@ Adam : 이식성의 * 제한 *에 동의합니다.호출자가 값을 제공 할 수 있도록 ctor를 포함하도록 수정합니다. –

3

이 질문에 대답하는 실제 방법이 없습니다. 짧은 정식 답은 연결이 작업 단위의 일생 동안 살아 있어야한다는 것입니다. 이 어떻게 사용되는지 알 수있는 방법이 없으므로 (응용 프로그램의 수명 동안 존재합니까? 아니면 인스턴스화하고 무언가를 할 때마다 처분합니까?) 구체적인 대답을 제공하는 것은 불가능합니다.

즉, 첫 번째 패턴을 권하고 싶지만 필요에 따라 DataAccess 개체를 인스턴스화하고 처리하십시오. 필요 이상으로 오래 보관하지 마십시오.

0

당신의 DataAccess 객체가 어떻게 사용되는지에 달려 있다고 생각합니다. '사용'절에서 사용되면 연결이 완료된 후에 연결이 보장됩니다.

그러나 일반적으로 SQL 연결이 만들어지고 Execute 메서드 내에서 삭제되므로 DataAccess 개체를 삭제하지 않을 때 열리지 않을 가능성이 적은 두 번째 패턴을 선호합니다.

SQL 연결이 희소 한 리소스가 될 수 있으므로 모든 시도가 낭비되지 않도록해야한다고 생각합니다.

0

동시 호출을하면 첫 번째 오류가 발생합니다. 두 번째 명령은 각 명령에 대해 깨끗한 연결을 사용하여 더 많은 연결이 이루어 지도록합니다.

나는 시나리오와 관련하여 사용하는 시나리오에 따라 우선 문제를 극복하기 위해이 패턴을 사용해야하는 래퍼가 있으므로 필드 값을 설정하여 부울을 보여줍니다. 명령이 연결에서 실행 중이면 실행을 위해 다음 명령을 "대기"합니다.

물론 클래스가 연결 문자열을 읽어 가진 *에 대해 *

관련 문제