2009-06-06 3 views
6

Java와 C#에서는 둘 다 System.terminate()와 같은 것을 가지고 있습니다. 내 프로그램에 데이터베이스 연결, 데이터베이스 리더 및 데이터베이스 명령 변수가 열려 있고 catch 절에서 프로그램을 종료하면 데이터베이스 리소스가 계속 사용됩니까? 또는 전체 프로그램이 방금 종료 된 후 자동으로 해제됩니까?콘솔 프로그램이 종료되면 프로그램에서 사용 된 데이터베이스 연결이 여전히 열려 있습니까?

일반적으로 정상적인 프로그램 종료 또는 예기치 않은 프로그램 종료로 데이터베이스 연결을 항상 해제하도록 이러한 경우를 처리해야합니까? 좋은 습관?

답변

0

을 정리 폐기 당신은 일반적으로 가까운 연결 즉시 예를 들어, 그들을 사용 후 :

using(SqlConnection connection = ...) 
{ 
    ... do something ... 
} // connection disposed/closed here 

그러나 일반적으로 연결 풀을 사용하게되며 연결 풀이 반환됩니다. 따라서 프로세스는 여전히 데이터베이스 서버에 활성 연결을 유지합니다.

깨끗하게 종료하면 연결 풀이 정리되고 데이터베이스에 대한 실제 연결이 닫힙니다 (데이터베이스 서버에서 열린 연결을 통해이를 확인할 수 있음).

그러나 응용 프로그램이 연결을 종료하지 않고 중단 될 수있는 상황 (예 : Environment.FailFast 호출)이 있습니다.이 경우 결국 데이터베이스 서버가 시간 초과되어 닫히게됩니다.

+0

연결 풀을 확장 할 수 있습니까? 어떻게 구현할 수 있습니까? – Saobi

5

연결을 구체적으로 닫지 않으면 시간 초과가 발생할 때까지 열려 있습니다.

나는 이것을 C#에서 어려운 방법으로 몇 번 발견했습니다. 우수 사례는 더 이상 필요하지 않을 것으로 판단되는 리소스를 종료/종료하도록 지시합니다. 파일 입출력 스트림, DB 연결 등

+0

응용 프로그램이 충돌하더라도 사실입니까? (우스꽝스럽지 않은, 호기심이 많은) –

+1

나는 그렇게 상상할 것이다. 내 말은, 만약 당신이 try/catch하고 파일을 편집하는 중이고 파워 코드를 잡아 당겼다면. 저축은 림보에서 잃어 버릴 것입니다 .... –

+0

나는 이것이 충돌의 유형에 달려 있다고 생각합니다. 특정 충돌은 런타임에 영향을 미칠 수 있습니다 (예 : 전원 코드 잡아 당김, 스택 오버플로 등).이 경우 연결은 제한 시간에 도달 할 때까지 열린 상태로 유지됩니다. 그러나 간단한 예외가 발생하면 런타임에서 여전히 연결을 닫으려고 시도한다고 생각합니다 ('finally'블록 인 경우) –

6

프로세스가 종료되면 관련된 모든 리소스 (메모리, 핸들, 연결 등 포함)가 해제됩니다.

일반적으로 C#에서는 Dispose 패턴/using 문을 사용하여 희소 한 리소스를 제어합니다.

+1

제 생각에 최선을 다 하겠습니다. 내가 궁금해하는 점은 PSU_Kardi가 그 반대를 주장하고 더 많은 upvotes를 가지고 있다는 것입니다. 그럼 누가 옳은가? –

+0

@ MasterPeter : 이것은 분명히 플랫폼에 의존하는 것입니다. 하지만 필자가 보았던 대부분의 주요 시스템에서는 이것이 사실입니다. –

+0

잘못된 주문 주문이 수정되었습니다. –

-1

다음 GC에서 지워야하지만 정확하게 C#에서는 구조적 예외 처리의 마지막 블록에서 연결을 닫을 수 있습니다.

try { 
    // open DB connection 
} catch (Exception ex) { 
    // deal with exception 
} finally { 
    // close and dispose connection 
} 
+0

확인. 하지만 만약 내가 DB를 연결 진술 내 프로그램을 통해 밖으로 확산, 그래서 내가 그들을 하나의 try/catch/finally에 넣을 수는 없다. 나는 방금 try/catch/finally 블럭에 ENTIRE 프로그램을 넣어야합니까? 예기치 않은 에러가 발생할 때마다 db가 닫힙니다. 하지만 모든 것을 하나의 큰 try/catch/puts에 넣는 것은 우아하지 않습니다. – Saobi

+0

Errr ... 프로세스가 존재하지 않을 때 GC는 어디에 있습니까? –

+1

Saobi : DB 코드를 더 관리하기 쉬운 덩어리로 분할하고 각각에 try/catch 블록을 두어야합니다. Curt : 비정상 종료가 항상 연결을 종료한다는 것을 보장 할 수 없기 때문에 프로세스가 종료되기 전에 프로세스를 종료하는 것보다 낫습니다. –

0

일반적인 POSIX 동작은 프로그램이 종료되면 모든 파일 핸들, 네트워크 연결 등이 닫히는 것입니다. 그 시점에서 상대방이 올바른 일을하는지 여부는 공개적인 질문이지만 합리적으로 인기있는 RDBMS를 사용한다면 괜찮습니다.

1

C#의 경우 가비지 수집 대상 개체에 finalizer가 구현되어 있으면 암시 적 정리가 가비지 수집기에서 수행됩니다. 데이터베이스 연결과 같은 관리되지 않는 리소스 정리는 Dispose 메서드에서 수행 할 수 있습니다.

자세한 내용은이 문서를 참조하십시오 :

구현의 Finalize를 및 C#에서 관리되지 않는 리소스
http://msdn.microsoft.com/en-us/library/b1yfkh5e(VS.71).aspx

1

프로세스가 종료되면 열려있는 모든 파일 설명자가 운영 체제에서 해제되어야합니다. 파일 설명자에는 일반적으로 데이터베이스 연결을 포괄하는 파일 및 소켓이 포함됩니다.

귀하의 고객이 연결을 종료하면 연결이 끊어집니다. 서버가하는 일을 알려주지 않습니다. 작성 방법에 따라 서버가 연결을 계속 열어두고 클라이언트에서 도착하지 않을 메시지를 기다리거나 심지어 데이터를 보내려고 시도 할 수도 있습니다. 이것들은 아마 결국 시간 초과 될 것이지만 이것은 잘 계획되지 않을 수도 있습니다. (괜찮은 RDBMS의 경우에는 그렇지만 그렇지 않을 수도 있습니다.) 따라서 RDBMS에 따라 리소스를 해제하라는 명령을 내리기 위해 서버를 알려주는 단계를 수행해야 할 수도 있습니다.

1

SQL Server로 작업하는 경우 sysprocesses를 보거나 sp_who2를 실행할 수 있습니다. 나는 내 컴퓨터에서이 테스트 연결은 닫히지 않습니다 예 : 나는의 sp_who2 양쪽을 확인했습니다

Console.Write("Opening connection"); 
Console.ReadLine(); 
SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=SeniorMail;Integrated Security=SSPI;"); 
connection.Open(); 
SqlCommand command = new SqlCommand("SELECT count(*) from Account", connection); 
Console.Write("Running sql"); 
Console.ReadLine(); 
int? count = command.ExecuteScalar() as int?; 
Console.Write("Now I'll throw an exception"); 
Console.ReadLine(); 
int a = 0, b = 1, c = 0; 

try 
{ 
    c = b/a; 
} 
catch 
{ 
    Environment.Exit(1); 
} 

"지금은 예외를 던질거야", 나는 연결이 응용 프로그램 후 사라 볼 수 있습니다 종료.

관련 문제