2009-11-10 6 views
12

세션 전체에서 연결을 유지하는 것이 현명한 방법입니까? MySql 데이터베이스에 연결하는 C# 응용 프로그램을 만들었습니다.이 프로그램은 읽고 쓰고 응용 프로그램은 약 10 시간 연속으로 실행되어야합니다.MySql 연결을 열어 둘 수 있습니까?

데이터베이스에서 무언가를 뽑아 내고 새로운 무언가가 필요할 때마다 다시 열 때마다 close() 함수를 호출 할 때마다 연결을 유지할 위험이 있습니까?

답변

8

, 괜찮만큼 : 당신이 MySQL의 연결 제한에 충돌 많은 동시에 유휴 연결이없는

  1. ;

  2. 아무 것도하지 않고 시간에 열어 두지 마십시오. 기본 MySQL 연결 wait_timeout은 8 시간입니다. 그 동안 오랫동안 연결을 비활성 상태로두면 다음에 사용할 때 "MySQL 서버가 사라졌습니다"라는 오류가 발생합니다.

+2

연결을 열어 두지 않고도 얻을 수있는 것은 없습니다 (공급자가 연결 풀링을 사용한다고 가정). 공식적인 MySQL Connector/Net 공급자는 기본적으로 연결 풀링을 사용합니다. OP는 실제로 사용하고있는 공급자를 언급하지 않지만 풀링을 지원하는 경우 공개 늦은/닫는 초기 전략을 사용하고 공급자가 기본 물리적 연결을 관리하게합니다. – LukeH

+0

오래된 스레드에 대한 덧글을 추가해 주셔서 죄송합니다. http://download.oracle.com/javadb/10.3.3.0/devguide/cdevconcepts89498.html을 읽으십시오. 애플리케이션에 다중 스레드/트랜잭션이있는 한, 각 스레드를 고유 연결에 할당하는 것이 좋습니다. . 감사. –

0

응용 프로그램이 연결을 사용하는 경우 닫을 이유가 없습니다. 연결이 필요하지 않으면 닫아야합니다. 여러 응용 프로그램을 데이터베이스에 연결하려면 해당 데이터베이스에 대한 연결 수가 고정되어 있어야합니다. 그렇기 때문에 작업이 끝나면 닫고 필요할 때 다시 열어야합니다. 잠시 동안 열린 연결을 떠나

0

보안상의 관점에서, 다른 프로그램이 열린 연결에 자체 프로그램을 삽입 할 수 없도록 쿼리를 종료하는 것이 좋습니다.

성능이 향상되면서 전체 연결이 열리는 것이 분명합니다.

선택 ^^

9

당신은 ADO.NET을 사용하고 있기 때문에, 당신은 기능을 풀링 ADO.NET의 붙박이 연결을 사용할 수 있습니다. 사실 은 항상 ADO.NET의 inbuilt 연결 풀링 기능을 사용해야합니다. 이렇게하면 .NET 런타임을 통해 백그라운드에서 사용자의 연결을 투명하게 관리 할 수 ​​있습니다. 새로운 연결을 열면 연결을 잠그고 다시 연결하더라도 잠시 동안 연결을 유지합니다. 이것은 정말 빠릅니다.

풀링 된 연결을 기본 동작이 아니기 때문에 연결 문자열에 언급했는지 확인하십시오. 당신은 어떻게 생각하고있어

using (var connection = SomeMethodThatCreatesAConnectionObject()) 
{ 
    // do your stuff here 
    connection.Close(); // this is not necessary as 
         // Dispose() closes it anyway 
         // but still nice to do. 
} 

그것을 할 : 당신이 그들을 필요로 할 때 새 연결을 만드는 오버 헤드가 없다, 그래서 그들이 backrgound에 풀링하고 있기 때문에

는 당신은 로컬 연결을 작성해야 . NET에서.

0

아니요, 연결을 열어두고 다시 사용하지 않는 이유는 없습니다. 결국 이것은 일반적으로 예약 된 다양한 연결 풀 기술의 핵심입니다. 작업이 모두 동일한 데이터 소스에서 작동하는 멀티 스레드 환경의 경우).

하지만 bobince가 대답을 확장하려면 연결을 종료하지 않는 것이 좋습니다. 연결이 끊어 질 수 있고 연결 문제가 있거나 백 명이있을 수 있다고 가정하지 마십시오. 연결이 끊어지는 다른 이유. 연결이 없을 수도 있다고 가정하고이 예외 상황을 코드에 논리를 추가해야합니다.

0

제 생각에는 연결을 유지하는 것이 바람직하지 않습니다. 매번 연결을 닫는 것에 대한 또 다른 측면은 확장 성입니다. 이제는 열어 두는 것이 좋겠지 만 앱을 사용자의 3 배의 두 배 사용하면 어떻게 될까요? 다시 돌아가서 모든 코드를 변경하는 것은 목의 통증입니다. (나는 그것을 해냈다 :-)

0

코드에서 연결 풀링을 사용하면 문제가 해결 될 것이다. 연결을 열고 닫을 필요가 없으므로 연결을 여는 동안 사용되는 귀중한 리소스를 절약 할 수 있습니다. 연결을 요청하면 유휴 연결을 반환하는 풀로 연결을 반환합니다.

당연히 나는 연결의 인스턴스를 얻고, 그것을 사용하고, 작업을 커밋/롤백하고 풀로 되돌려 놓습니다. 나는 오랫동안 연결을 열어 놓는 것을 제안하지 않을 것이다.

0

다른 답변에서 보지 못한 한 가지 : 명령문이나 임시 테이블을 준비한 경우 연결이 닫힐 때까지 서버 리소스를 차단할 수 있습니다. 그러나 다른 한편으로는 몇 분마다 다시 연결하는 대신 연결을 유지하는 것이 유용 할 수 있습니다.

0

끊임없이 연결을 열고 닫으면 성능이 저하됩니다. 연결 풀링을 사용하는 것이 현명 할 수도 있고 앱의 실행 복사본이 너무 많아서 너무 많은 데이터베이스 연결을 차지할 염려가있는 경우 짧은 wait_timeout을 사용하는 것이 좋습니다. 제공된 예 당신이 할 수있는

+0

이것은 사실이 아닙니다. 이것은 실행중인 유일한 응용 프로그램이며 아무 것도 연결을 시도하지 않아야합니다. – Pieter888

+1

이 경우 연결을 끊어 버리고 싶다는 말을 들어 본 적이 없습니다. 앱이 자동으로 투명하게 연결을 재설정 할 수있는 경우 추가 보안을 제공하지 않습니다 (실제로는 각 인증이 약간의 정보를 노출하기 때문에 일부는 손실됩니다). 사실 커넥션 풀링 (connection pooling)이라는 유명한 빌트인 기능은 커넥션을 닫으라는 코드를 말할 때도 커넥션을 그대로 유지시켜 인증 오버 헤드없이 연결을 다른 프로세스가 재사용 할 수 있도록합니다. – MightyE

+0

그래서 연결이 * 열렸을 때 자동으로 다시 연결됩니다 *? 아니면 그것을 탐지하기 위해 자체 코드를 작성해야합니까? – Pieter888

0

:

  • 연결이 "조용한 간다"경우에 당신이 뭔가 이상한
  • 당신은 감지 발생하는 경우
  • 당신은 연결 상태를 재설정 할 수있는 연결이 끊어 질 경우 다시 연결됩니다 예를 들어, 방화벽 시간 초과가 발생하는 경우

기본적으로 장애 발생시 올바른 복구가 필요합니다. 연결 및 연결 해제가 훨씬 쉽습니다.

0

연결 풀링 메커니즘이있는 경우 연결을 닫는 것이 좋습니다.

이유 중 하나는 연결이 아직 살아 있는지 다시 확인할 필요가 없다는 것입니다.

관련 문제