2

DbProviderFactory을 기반으로 일부 오래된 코드를 리팩터링하여 연결 풀링을 활용하고 있지만 간단한 질문이 있습니다. 객체가 DbProviderFactories.GetFactory()에 의해 thread-safe로 반환 되었습니까? 등.net DbProviderFactory 스레드가 안전합니까?

DbProviderFactory factory = DbProviderFactories.GetFactory("Provider String from config"); 
var connection = factory.CreateConnection(); 
connection.ConnectionString = "connection string from config"; 

등,하지만이 스레드에 한 번 수행됩니다

이제 코드는 다음입니다. 분명히 내가 원하는 걸하지 않을거야.

어디서나 "공장"개체를 사용할 수 있을지 궁금한가요? 동일한 DbProviderFactory 개체의 여러 스레드에서 여러 연결을 만들 수 있습니까? 동일한 공장의 클래스를 다시 작성할 수 있습니까?

바보 같이, 구체적인 하위 클래스의 MSDN 문서는 사용자가이 작업을 수행 할 수 있는지 여부를 말하지 않습니다. 예를 들어 CreateDataAdapter() 메서드의 경우 SqlClientFactorymsdn doc 메서드는 스레드로부터 안전한지 여부를 나타내지 않습니다. 인터넷에 몇 가지 가이드에 대한 단지 SqlConnection의 인스턴스를 개방하고 그것은 괜찮 스레드 풀링을 수행 하겠지만, 다음이 작업을 수행 할 경우 :

SqlConnection connection = new SqlConnection("my connection string); 
DbDataAdapter adapt = DbProviderFactories.GetFactory(connection).CreateDataAdapter(); 

는 스레드 - 안전합니까? 얼마나 공장이 존재합니까? 그걸 GetFactory 메서드는 스레드간에 반환 무엇입니까? 항상 같은 물건? 안 그래요? 내 기존 코드는 DbDataAdapter을 많이 사용하므로 변경하지 않으려 고합니다.

그래서 팩토리를 가져 와서 여러 스레드에서 사용할 수 있습니까?

답변

1

MSDN는 말한다 : -

스레드로부터의 안전성이 형식의 멤버 스레드로부터 안전합니다 (Visual Basic의 경우 Shared)

모든 공용 static. 모든 인스턴스 구성원은 스레드 안전성을 보장하지 않습니다.

+0

그래, 사실상 라이브러리의 모든 클래스에 대한 기본 메시지입니다. 그리고 수업 중에 다른 어떤 것에 대한 문서가 없다는 것을 고려하면 "아직 문서화하지 못했습니다"IMO. –

+0

@ 케빈 : - 그렇다해도 IMO에 동의합니다! –