2011-09-19 4 views
2

현재 MySQL Community Server 데이터베이스에 연결하고 쿼리를 실행하는 C# (.NET) 프로젝트를 작성 중입니다. 현재 데이터베이스에 연결하기 위해 자신의 MySQLConnection 객체 (MySQL .NET 커넥터를 사용하고 있습니다)를 사용하는 4 개의 클래스가 있습니다.C# + MySQL 연결

이 좋은 방법입니까, 아니면 '전역'(정적?) 연결을 사용해야합니까? 하나의 단일 연결을 사용하는 것은 코드를 구조화하는 습관에 위배됩니다. 하나의 공유 정적 필드로 작업하는 100,000 개 개체의 큰 팬이 아닙니다. 나는 그것이 대부분의 프로그래머의 견해에도 위배된다고 생각한다.

일단 connection.Close()를 호출하면 연결이 반드시 닫히지 않는 것으로 나타났습니다. .Open()을 다시 시도하면 예외가 발생합니다. 연결 문자열에 "Pooling = False"를 설정하지 않았기 때문에 이것이 신뢰할 수 있습니다. 나는 그것으로 실험 할 것이다. 이것에 대해서도 생각이 있다면, 여기로 내려주십시오.

간단히 말해, MySQLConnections를 구성하는 방법에 대한 의견이 있습니다. 모든 프로그램의 클래스에서 사용되는 정적 인 하나의 MySQLConnection이 더 좋다고 생각한다면 (성능상의 문제 일 필요는 없다. 데이터베이스 시스템 자체에 여러 개의 MySQLConnections가 미치는 영향에 대해 더 자세히 말하고있다.) 왜 그렇게 생각하는지 알려주지. .

저는 최종 프로그램이 약 10 개 또는 15 개의 클래스를 가질 것으로 예상합니다. 각각은 적극적으로 데이터베이스를 쿼리합니다. 엄지 손가락의

+0

젠장, 나는 오직 하나의 대답만을 선택할 수 있습니다. 3 개 모두 훌륭합니다. 클래스 당 하나의 연결입니다. 가능한 한 빨리 닫고 새 연결이 필요한 경우 새 개체를 만듭니다. Unit of Work 및 MARS에 대한 정보를 제공해 주셔서 감사합니다. –

답변

0

클래스 당 하나의 연결을 계속할 수 있습니다. 대부분의 ADO.NET 공급자는 사용자가 알아챈 것처럼 연결 풀링을 사용합니다. Close은 실제로 연결을 닫지 않지만 연결을 풀에 반환합니다. 그러나 연결을 다시 시도하지 말고 새 연결 개체를 만듭니다.

클래스 당 하나의 연결을 사용하여 하나의 몰락이 있으며 이는 트랜잭션 처리입니다. TransactionScope을 사용하지 않는 한 트랜잭션을 여러 연결에서 공유 할 수 없습니다.

보통 "세션"당 하나의 연결을 선호하며 생성자의 연결을 내 저장소 클래스로 가져옵니다. (일반적으로 컨트롤 컨테이너의 반전을 사용하므로). Google은 Unit Of Work 구현에 대해 조금만 설명합니다.

2

내 규칙은 다음과 같습니다

  • 는만큼 짧은 시간 동안 열려있는 연결을 유지할 수
  • 하자 프로세스가에 particpating 만하면
  • 주 연결 풀링 ADO.NET 핸들 연결 트랜잭션을 함께 사용하십시오.

따라서 하나의 글로벌 정적 연결을 사용하면 안됩니다. 그러나 열린 연결로 데이터 가져 오기 메소드를 제공하는 유틸리티 메소드를 가질 수 있습니다. 그런 다음 같은 것을 할 것 (Sql 가정하면 유틸리티 클래스입니다) :

public IEnumerable<MyClass> GetSomeData() 
{ 
    using (var cn = Sql.GetOpenConnection()) 
    { 
     //get your data here 
    } 
} 
0

는 하나의 공유 연결을 만들지 마십시오. 가능한 한 늦게 나와 가능한 빨리 닫으십시오. 여러 쿼리에 대한 연결을 사용해야 할 경우, MySQL 커넥터가 지원하는지 모를 MARS (다중 활성 레코드 세트)를 살펴보십시오.

certianly는 연결 풀링을 처리합니다. DB 연결은 비쌉니다.

-1
public class DALCommon 
{ 
    public static string GetConnectionString 
    { 
     //return System.Configuration.ConfigurationManager.AppSettings["connectionInfo"]; 

     get 
     { 
      NameValueCollection appSettings = ConfigurationManager.AppSettings; 
      string server = appSettings["server"]; 
      string userid = appSettings["userid"]; 
      string password = appSettings["password"]; 

      return String.Format("server={0};user id={1}; password={2}; database=dbmystock; pooling=false", server, userid, password); 
     } 
    } 
}