2013-07-10 1 views
1

내 응용 프로그램이 주기적으로 MyDatabase에 연결하여 쿼리를 수행합니다.이전 연결 오류 후 새로 생성 된 데이터베이스에 연결

MyDatabase 데이터베이스가 아직 존재하지 않아 작성해야하는 경우를 처리해야합니다. 내가 현재하고있는 중이 것은 내가 처음과 같이 뭔가를 마스터 데이터베이스에 연결하고 실행할 때마다입니다 :

SELECT * FROM sysdatabases WHERE NAME='MyDatabase'

는하여 MyDatabase이 있는지 여부를 결정합니다. 그렇지 않다면 MyDatabase에 연결하여 쿼리를 수행하십시오.

연결이 풀링 된 경우에도 마스터 데이터베이스에 별도로 연결을 열고 쿼리를 수행 할 때마다 불필요한 것처럼 보입니다. 왜 MyDatabase에 바로 연결할 수 없습니까? 성공할 확률은 99 %이며 쿼리를 실행할 수 있습니다. 실패한 시간의 1 %는 MyDatabase가 누락되었음을 감지하고 그 시점에서 바로 생성 할 수 있습니까?

하지만이 문제를 시도 할 때 문제가 발생했습니다. MyDatabase에 연결하려고 시도했지만 존재하지 않는 경우 SqlException이 발생합니다.

Cannot open database MyDatabase requested by the login. The login failed.

Fine. 큰. 모든 SqlException을 catch 한 다음 마스터 데이터베이스로 이동하여 MyDatabase가 존재하지 않는지 확인하고 생성 할 수 있습니다.

하지만를 생성 한 후, 때 나는 지금 즉시이 같은 오류가 MYDATABASE에 연결을 시도 : 캐시를 반환하는 대신 다시 연결을 시도되지 않고 같은

Cannot open database MyDatabase requested by the login. The login failed.

같습니다 결과. 연결을 시도하기 전에 데이터베이스를 만든 후 10 초를 기다리면 연결이 성공합니다.

제 질문은,이 캐싱이 예상되는 것입니까 (더욱 그렇습니다). 그리고 더 중요한 것은이 상황을 처리하기위한 모범 사례가 있습니까? 사용할 수있는 SqlConnection API에 캐시 정리 또는 시간 초과 설정이 있습니까? 내 자신의 타임 아웃 지연을 구현할 수는 있지만 더 나은 방법이 없다는 것을 알고 싶습니다.

+0

데이터베이스를 만드는 데 얼마나 걸리나요? 파일이 현재 서버에 생성되고 DB가 실제로 준비되지 않았습니까? – steoleary

+0

거의 즉시 생성됩니다. 이전 오류없이 작성 및 연결을 시도했지만 정상적으로 작동했습니다. 이전 연결이 실패하면 동작이 달라집니다. 이 경우 약 10 초 내에 다시 연결하려고하면 같은 오류가 발생합니다. –

답변

1

나는 정확히 같은 문제가있었습니다.

새로 만든 데이터베이스를 열려고 시도하기 전에 고정 SqlConnection.ClearAllPools() 메서드를 호출하면 올바르게 작동합니다.

+0

나는이 작업을 기억하고 있다고 생각하는데, 내 경우에는 더 큰 시스템에서이 작업을 수행해야하는 작은 구성 요소이기 때문에 전체 연결 풀을 지울 수 있는지 여부에 대한 몇 가지 논란이있었습니다. –