2010-01-26 10 views
1

나는 SQL 스크립트를 실행하여 데이터베이스와 테이블을 생성 한 다음 데이터를 삽입하는 테스트 콘솔 앱을 가지고있다. DAO를 사용하여 테이블을 생성, 검색, 업데이트 및 삭제 한 다음 데이터베이스를 삭제하려고 시도하지만 현재 사용 중이므로 DAO를 사용할 수 없습니다. 어떻게 연결을 끊을 수 있습니까? 디버깅을하고 SQL 스크립트를 실행하여 총 연결을 확인한 결과, 연결을 종료하지 않는 코드 조각으로 좁혀졌습니다. 연결이 해제되었다고 말하면서도 데이터베이스는 여전히 연결되어 있다고 말합니다.SQL 연결 닫기 (NHibernate)

foreach (ISessionFactory factory in this.connections.Values) 
{ 
    factory.Close(); 
} 

this.connections.Clear(); 
this.connections = null; 
+0

일반적으로, 당신은 SessionFactory를 닫을 필요가 없습니다 ... 직접 NHibernate에 통해이 작업을 수행 할 수 있을지 모르겠지만, 당신은 ClearPool 또는 ClearAllPools 전화 발행하는 SQLConnection 객체를 사용할 수 있습니다 . 왜 여러 세션 요인이 있습니까? 코드의 다른 곳에서 연결이 열려있을 수 있습니다. – Paco

답변

1

NHibernate는 모든 데이터베이스 연결 자체를 관리합니다. 데이터베이스를 적절하게 열고 닫지 만 Session.Disconnect를 호출하여 ADO.NET 연결에서 연결을 끊을 수 있습니다.

그러나 일반적으로 '기본'연결 동작 인 연결 풀링을 사용하는 경우 연결은 연결 풀에만 반환되며 해제되지는 않으며 여전히 연결로 표시되므로 연결 풀을 정리해야합니다.

불행하게도,

+0

감사합니다. 원래 코드에서 풀을 지우고 있었고 연결 문자열에서 Pooling = false를 사용하려고 시도 했으므로 작동하지 않아 트릭을 수행하는 것 같습니다. 코드가 연결 문자열에서 작동하고 코드가 작동하지 않는 이유는 무엇입니까? – Sarah

+3

연결 풀은 좋은 것입니다. 풀의 연결 트랜잭션을 열어 두거나 자원을 소비하지 마십시오. 따라서 "정리"할 필요가 없습니다. 반면에 풀에서 연결을 사용할 수있는 경우 새 연결을 만들지 않아도됩니다. 수영장 청소는 확실히 성능을 해칠 것입니다. –