2009-10-05 5 views
2

ADO.Net 호환 인터페이스 인 MySQL 제공 커넥터/NET을 통해 MySQL을 사용하는 ASP.Net 웹 응용 프로그램을 개발 중입니다. 내 이해 ASP.Net 동시 요청을 별도의 스레드에서 처리됩니다, 그래서 내 코드는 스레드로부터 안전해야합니다.ADO.Net을 사용하여 MySQL에 대한 다중 스레드 액세스

MySQL 문서에서 스레드로부터 안전하게 API를 사용하는 방법을 명확하게 설명하는 항목을 찾을 수 없습니다. MySqlCommand에 대한 설명은 다음과 같습니다.

이 유형의 공용 static (Visual Basic의 경우 Shared) 멤버는 다중 스레드 연산에 안전합니다. 인스턴스 멤버는 스레드로부터 안전함을 보증하지 않습니다.

정적 인 메서드를 동시에 호출하지 않는다면 스레드간에 연결 개체를 공유하는 것이 안전하다는 것을 이해해야합니다. 즉, 내가 할 수있을 에게서는 :

IDbConnection myConnection = GetSomeConnection(); // Returns a shared object 
IDbCommand cmd; 

lock(myConnection) 
{ 
    cmd = myConnection.CreateCommand(); 
} 

// Some code using cmd 

그러나, 나는 아직 문서가이 안전하다는 것을 알리는 찾을 수없는 것을 걱정, 그것을 알리는 문서의 부족은 안전하지 않습니다.

안전하지 않은 경우 스레드 로컬 연결을 사용하는 것이 좋습니다. 그렇지 않으면 일종의 연결 풀을 구현해야합니까?

답변

1

필요할 때 IDbConnection을 사용하고 SQL 쿼리를 완료하자마자 폐기하십시오. 연결은 연결 풀로 돌아가고 다른 스레드 일지라도 다음 번에 동일한 연결 문자열로 연결을 열 때 다른 스레드가 다시 사용합니다. 여기에 잠금 장치를 설치할 필요가 없습니다.

using(IDbConnection myConnection = GetSomeConnection()){ 
    IDbCommand cmd = myConnection.CreateCommand(); 
} 

연결이 자동으로 배치되고 연결 풀에 반환합니다

1

문을 사용하면 도움이 될 수 있습니다.

0

스레드간에 연결을 공유하지 마십시오. 연결 객체를 스레드 로컬로 유지하고 가능한 한 늦게 열고 가능한 한 빨리 닫습니다 (가능하면 using 블록으로).

using (MySqlConnection conn = new MySqlConnection("...")) 
{ 
    // do work 
} 

는 지금까지 내가 알고 있어요 같이 MySQL의 커넥터가 연결 풀링을 지원하고 그래서 그냥 연결 풀을 관리하는 방법에 대한 커넥터 걱정을하자, 기본적으로 사용합니다.

관련 문제