데이터베이스 연결을 한 번 또는 모든 데이터베이션에서 열 수 있습니까?

StackOverflow https://stackoverflow.com/questions/611023

문제

IM은 현재 데이터베이스 사용에 크게 의존하는 ASP.NET을 사용하여 WebPortal을 만들고 있습니다. 기본적으로 모든 사용자로부터 쿼리를 얻으면 웹 서버에서 데이터베이스에 대한 쿼리가 발생합니다.

이제 저는 이것에 정말 새롭고 성능에 대해 매우 걱정하고 있습니다. 이 분야에서의 경험 부족으로 인해 나는 무엇을 기대 해야하는지 모르겠습니다.

내 질문은 Ado.net을 사용하여 웹 서버에서 데이터베이스까지 정적 연결을 열어 두는 것이 더 현명한 선택 일 것입니다. 그런 다음 각 쿼리가 데이터베이스에 대한이 연결 서버 사이드의 통합을 확인 하는가? - 또는 각 쿼리 전에 연결을 열고 나중에 닫지 않는 것이 좋습니다.

내 머리에서는 시간 핸드 쉐이킹 등을 절약 할 때 첫 번째 옵션이 더 나을 것입니다. 각 쿼리와 데이터베이스와 서버 측 모두에 메모리를 저장하기 전에 하나의 연결이 있지만이 접근 방식에는 몰락이 있습니까? 2 개의 쿼리가 동시에 서로 무결성을 파괴하거나 반환 된 데이터 세트를 혼합 할 수 있습니까?

나는 여기와 웹에서 어디에서나 검색하여 이것에 대한 최고의 실습을 찾았지만 운이 없었습니다. 내가 얻은 가장 가까운 것은 이것이었습니다. 데이터베이스 연결을 오랫동안 열어 두는 것이 안전합니까? 그러나 데이터베이스의 한 명 이상이있는 분산 시스템에 더 적합한 것처럼 보이지만 웹 서버 만 얻었습니다.

도움이 되었습니까?

해결책

당신은 성능에 대해 일찍 걱정하고 있습니다.

어쨌든 연결은 프레임 워크에 의해 풀링됩니다. 당신은 그들을 열고, 그들을 사용하고, 최대한 빨리 처분해야합니다.

... 같은 ...

public object Load()
{
  using (SqlConnection cn = new SqlConnection(connectionString))
  using (SqlCommand cm = new SqlCommand(commandString, cn))
  {
    cn.Open();
    return cm.ExecuteScalar();
  }
}

다른 팁

Ado.net이 연결 풀링을 처리하도록하는 것이 좋습니다. 필요하다고 생각되면 연결이 지속되지만 정적 연결 객체를 사용하지 않습니다. 그냥 냄새가 난다. 연결 객체를 필요한 메소드로 전달하고 연결을 만드는 것이 좋습니다. using 차단하다.

DB 상호 작용을 마친 후에는 항상 연결을 닫아야합니다. ADO.NET에는 효율적인 연결 재사용을 처리 할 연결 풀링이 있습니다. 2, 3, 후속 연결을 열 때마다 오버 헤드가 거의없는 수영장에서 가져갑니다.

도움이 되었기를 바랍니다.

고급 연결 풀링보다 캐싱에 대해 더 많이 생각하고 있습니다. 모든 GET은 데이터베이스 히트가 필요합니까?

공통 콘텐츠와 사용자 별 컨텐츠가있는 경우 캐시를 사용하여 공통 항목과 Mangled 키 (사용자 ID 포함)를 보관할 수 있습니다. 사용자 별 항목을 저장할 수 있습니다.

ado.net은 연결 풀링을합니다. 연결 객체에서 닫기를 호출하면 풀의 연결을 유지하면 다음 연결이 훨씬 빠릅니다.

초기 직감이 정확합니다. 당신이 필요로하는 것은 데이터베이스 연결 풀링.

모든 데이터베이스 호출에 대한 연결을 열고 싶지 않으므로 성능이 매우 빠르게 발생합니다. 데이터베이스 연결을 설정하는 것은 매우 비쌉니다.

대신 사용해야 할 것은 연결 풀입니다. 풀은 연결을 관리하고 가능하면 기존 연결을 재사용하려고합니다.

나는 당신의 플랫폼을 알지 못하지만 연결 풀링을 살펴보십시오 - 기본 시스템 또는 추가 기능을 제공하거나 데이터베이스 드라이버와 함께 제공되는 라이브러리 또는 유틸리티가 있어야합니다. 풀에서 얻을 때 사용될 준비가되어있는 데이터베이스에 대한 활성 연결.

솔직히 말해서, 나는 모든 데이터베이스 추상화 라이브러리에서 풀링이 기본적으로 발생할 것으로 예상됩니다 (사용 가능한 옵션이있어). ado.net이 이것을하는 것 같습니다.

실제로 물어볼 첫 번째 질문은입니다 성능에 대해 매우 걱정하십니까? 예상 작업량은 무엇입니까? 아직 시도해 보셨습니까?

그러나 일반적으로 예, 매번 데이터베이스 연결을 다시 열는 것보다 잠시 동안 유지하는 공개 연결을 갖는 것이 더 똑똑합니다. 연결의 종류, 네트워크 문제 및 달의 단계에 따라 초기 연결을하기 위해 2 초 이상의 부분을 차지할 수 있습니다. 작업 부하가 5 초마다 얻을 수있는 것을 기대할 수있게되면 서있는 연결에 더 행복 해집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top