클래스 수준 연결을 선언하고 웹 서비스 생성자에서 초기화하는 것이 논리적 인 것처럼 보입니다.
아니요, 논리적으로 보이지 않습니다. ADO.NET에서는 connection pooling을 사용하므로이 작업을 수행 할 필요가 없습니다. 이 연결 풀은 응용 프로그램 도메인 당 연결 문자열 당입니다.
그래서 당신은 단순히 각 웹 방식의 풀에서 새 연결을 그리고 마지막에 풀에 반환 할 수합니다 (using
문이 처리됩니다) :
[WebMethod]
public void Foo()
{
// Here you are NOT creating a new connection to the database
// you are just drawing one from the connection pool
using (var conn = new SqlConnection(SomeConnectionString))
using (var cmd = conn.CreateCommand())
{
// Here you are NOT opening a new connection to the database
conn.Open();
cmd.CommandText = "SELECT id FROM foo";
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// do something with the results
}
}
} // Here you are NOT closing the connection, you are just returning it to the pool
}
을 그래서 여기에 조언이야 : 일부 클래스 필드, 정적 필드를 사용하여 수동으로 연결을 관리하지 마십시오.이 관리를 ADO.NET에 맡기는 것이 좋습니다.
참고 : 표시된 코드는 일반적으로 웹 메서드에서 호출하는 데이터 액세스 레이어에 있습니다.
대린 감사합니다. 그러나 이것은 실제로 피하려고 시도한 것입니다. 즉, {} 블록을 사용하여 각 메소드를 꾸미는 중입니다. 연결 풀링의 작동 방식을 이해합니다. 웹 서비스 클래스의 코드 오버 헤드가 줄어 듭니다. 모든 메소드에서 연결 객체를 사용할 필요가 있기 때문에 선언을 클래스 레벨에서 한 곳으로두고 생성자/소멸자 (논리적으로 의미 한 것)를 사용하기를 원했습니다. 당신이 묘사 한 것은 제가 현재 사용하고있는 것입니다. 나는 내가 추측하는 깔끔한 방법을 기대하고있었습니다. – aaaaaaaaaaaaaaa1111111
나는 정교해야한다 - 웹 서비스 클래스가 각 메서드 호출과 각 스레드에 대해 한 번 인스턴스화된다고 가정했다. 내가 성취하려고 노력하는 것은 사실 인 것에 달려 있습니다. 그것이 사실이 아니라면 당신의 모범이 유일한 길입니다. – aaaaaaaaaaaaaaa1111111