세션 전체에서 연결을 유지하는 것이 현명한 방법입니까? MySql 데이터베이스에 연결하는 C# 응용 프로그램을 만들었습니다.이 프로그램은 읽고 쓰고 응용 프로그램은 약 10 시간 연속으로 실행되어야합니다.MySql 연결을 열어 둘 수 있습니까?
데이터베이스에서 무언가를 뽑아 내고 새로운 무언가가 필요할 때마다 다시 열 때마다 close() 함수를 호출 할 때마다 연결을 유지할 위험이 있습니까?
세션 전체에서 연결을 유지하는 것이 현명한 방법입니까? MySql 데이터베이스에 연결하는 C# 응용 프로그램을 만들었습니다.이 프로그램은 읽고 쓰고 응용 프로그램은 약 10 시간 연속으로 실행되어야합니다.MySql 연결을 열어 둘 수 있습니까?
데이터베이스에서 무언가를 뽑아 내고 새로운 무언가가 필요할 때마다 다시 열 때마다 close() 함수를 호출 할 때마다 연결을 유지할 위험이 있습니까?
, 괜찮만큼 : 당신이 MySQL의 연결 제한에 충돌 많은 동시에 유휴 연결이없는
;
아무 것도하지 않고 시간에 열어 두지 마십시오. 기본 MySQL 연결 wait_timeout
은 8 시간입니다. 그 동안 오랫동안 연결을 비활성 상태로두면 다음에 사용할 때 "MySQL 서버가 사라졌습니다"라는 오류가 발생합니다.
응용 프로그램이 연결을 사용하는 경우 닫을 이유가 없습니다. 연결이 필요하지 않으면 닫아야합니다. 여러 응용 프로그램을 데이터베이스에 연결하려면 해당 데이터베이스에 대한 연결 수가 고정되어 있어야합니다. 그렇기 때문에 작업이 끝나면 닫고 필요할 때 다시 열어야합니다. 잠시 동안 열린 연결을 떠나
는보안상의 관점에서, 다른 프로그램이 열린 연결에 자체 프로그램을 삽입 할 수 없도록 쿼리를 종료하는 것이 좋습니다.
성능이 향상되면서 전체 연결이 열리는 것이 분명합니다.
선택 ^^
당신은 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에서.
아니요, 연결을 열어두고 다시 사용하지 않는 이유는 없습니다. 결국 이것은 일반적으로 예약 된 다양한 연결 풀 기술의 핵심입니다. 작업이 모두 동일한 데이터 소스에서 작동하는 멀티 스레드 환경의 경우).
하지만 bobince가 대답을 확장하려면 연결을 종료하지 않는 것이 좋습니다. 연결이 끊어 질 수 있고 연결 문제가 있거나 백 명이있을 수 있다고 가정하지 마십시오. 연결이 끊어지는 다른 이유. 연결이 없을 수도 있다고 가정하고이 예외 상황을 코드에 논리를 추가해야합니다.
제 생각에는 연결을 유지하는 것이 바람직하지 않습니다. 매번 연결을 닫는 것에 대한 또 다른 측면은 확장 성입니다. 이제는 열어 두는 것이 좋겠지 만 앱을 사용자의 3 배의 두 배 사용하면 어떻게 될까요? 다시 돌아가서 모든 코드를 변경하는 것은 목의 통증입니다. (나는 그것을 해냈다 :-)
코드에서 연결 풀링을 사용하면 문제가 해결 될 것이다. 연결을 열고 닫을 필요가 없으므로 연결을 여는 동안 사용되는 귀중한 리소스를 절약 할 수 있습니다. 연결을 요청하면 유휴 연결을 반환하는 풀로 연결을 반환합니다.
당연히 나는 연결의 인스턴스를 얻고, 그것을 사용하고, 작업을 커밋/롤백하고 풀로 되돌려 놓습니다. 나는 오랫동안 연결을 열어 놓는 것을 제안하지 않을 것이다.
다른 답변에서 보지 못한 한 가지 : 명령문이나 임시 테이블을 준비한 경우 연결이 닫힐 때까지 서버 리소스를 차단할 수 있습니다. 그러나 다른 한편으로는 몇 분마다 다시 연결하는 대신 연결을 유지하는 것이 유용 할 수 있습니다.
끊임없이 연결을 열고 닫으면 성능이 저하됩니다. 연결 풀링을 사용하는 것이 현명 할 수도 있고 앱의 실행 복사본이 너무 많아서 너무 많은 데이터베이스 연결을 차지할 염려가있는 경우 짧은 wait_timeout
을 사용하는 것이 좋습니다. 제공된 예 당신이 할 수있는
이것은 사실이 아닙니다. 이것은 실행중인 유일한 응용 프로그램이며 아무 것도 연결을 시도하지 않아야합니다. – Pieter888
이 경우 연결을 끊어 버리고 싶다는 말을 들어 본 적이 없습니다. 앱이 자동으로 투명하게 연결을 재설정 할 수있는 경우 추가 보안을 제공하지 않습니다 (실제로는 각 인증이 약간의 정보를 노출하기 때문에 일부는 손실됩니다). 사실 커넥션 풀링 (connection pooling)이라는 유명한 빌트인 기능은 커넥션을 닫으라는 코드를 말할 때도 커넥션을 그대로 유지시켜 인증 오버 헤드없이 연결을 다른 프로세스가 재사용 할 수 있도록합니다. – MightyE
그래서 연결이 * 열렸을 때 자동으로 다시 연결됩니다 *? 아니면 그것을 탐지하기 위해 자체 코드를 작성해야합니까? – Pieter888
:
기본적으로 장애 발생시 올바른 복구가 필요합니다. 연결 및 연결 해제가 훨씬 쉽습니다.
연결 풀링 메커니즘이있는 경우 연결을 닫는 것이 좋습니다.
이유 중 하나는 연결이 아직 살아 있는지 다시 확인할 필요가 없다는 것입니다.
연결을 열어 두지 않고도 얻을 수있는 것은 없습니다 (공급자가 연결 풀링을 사용한다고 가정). 공식적인 MySQL Connector/Net 공급자는 기본적으로 연결 풀링을 사용합니다. OP는 실제로 사용하고있는 공급자를 언급하지 않지만 풀링을 지원하는 경우 공개 늦은/닫는 초기 전략을 사용하고 공급자가 기본 물리적 연결을 관리하게합니다. – LukeH
오래된 스레드에 대한 덧글을 추가해 주셔서 죄송합니다. http://download.oracle.com/javadb/10.3.3.0/devguide/cdevconcepts89498.html을 읽으십시오. 애플리케이션에 다중 스레드/트랜잭션이있는 한, 각 스레드를 고유 연결에 할당하는 것이 좋습니다. . 감사. –