2011-09-04 2 views
4

나는 하루에 수십만 개의 레코드가 채워지는 SQL 서버 2k8 데이터베이스를 가지고있다.퍼시스턴트 db 연결과 열기 및 닫기

현재 db를 호출하고 n 개의 레코드를 검색하여 처리하고 일부 데이터를 db에 다시 쓰는 코드를 작성 중입니다.

function xyz() { 
    conn = conn creation code 
    conn.open(); 
    while(not last record) { 
     select next 1000 records 
     process each record 
     last record = true 
    } 
    conn.close(); 
    xyz(); 
} 

기본적으로 배치 당 하나의 연결을 만드는 :

내가이 (사이비 코드)를 어떻게 볼 두 가지 방법이 있습니다. 두 번째 방법 :

function xyz() { 
    conn = connection creation code 
    while(conn.open();) { 
     select next 1000 records 
     process each record 
     last record = true 
    } 
    conn.close(); 
    xyz(); 
} 

나는 더 나은 연습이 궁금합니다. 나는 그것이 후자 인 것처럼 느낀다. 그러나 그것은 또한 나의 DB에 더 많거나 적은 영구/영구 연결을 가질 것이다. 나는 메모리 오버런이나 그와 같은 것에 대해 걱정하고있다.

생각하십니까?

스콧

+0

mhhh ... 큰 거래를 할 수 없으므로 메모리 문제가 발생하지 않습니까? 분명히 그 연결을 열어서는 안되며 항상 닫아야한다고 생각합니다. –

+0

오픈 메서드가 void이므로, 기술적으로는 (conn.open()) 동안은 할 수 없습니다. 그래서 아무 것도 반환하지 않습니다. bool로 변환 될 수 있음). 큰 거래? 그래서 1000 레코드? 아니면 모두를 위해서? 분명히 그것들 모두는 작동하지 않을 것이다. 왜냐하면 그것이 실패하고 롤백되면, 데이터 손실 = 거대한 것이기 때문이다. –

답변

8

ADO.Net Sqlclient 공급자 (귀하가 C#라고 말한 이후로 사용하게됩니다)는 연결 풀링을 자동으로 수행합니다 (SQL Server Connection Pooling (ADO.NET) 참조). 풀링 된 연결은 닫기를 호출 할 때 실제로 닫히지 않으며 단순히 풀에 반환됩니다. '열기'및 '닫기'풀링 된 연결은 매우 빠릅니다.

관련이없는 참고 : 예외 조건에 connecitons 유출 방지

using (SqlConnection conn = new SqlConnection(...)) 
{ 
    conn.Open(); 
    ... 
} 

이 방법 : 당신이 using 블록의 연결을 포함한다.

2

가 나는 함수의 외부 연결을 처리하고 그것을 전달할 것입니다.이 기능은 데이터베이스 및 프로세스 항목에 연결하지 않는 항목을 처리하도록 설계되었습니다. 나는이 두 가지 일을 분리 할 것이다.

연결 열기/닫기가 가능한 한 : 예, 피해야합니다. 자체적으로 너무 느리다는 것은 아니지만 처리 만하는 경우 연결을 반복해서 열거 나 닫을 이유가 없습니다. 메모리 사용량 때문인 경우 (이 부분에서 C#에 익숙하지 않으므로이 부분이 잘못되었을 수 있음) 결과 집합을 해제해야합니다. 연결을 닫으면 연결된 메모리가 해제되지만 다시 연결하지 않아도 동일한 효과를 얻을 수 있어야합니다.

0

연결을 닫았다가 다시 열어야 할 이유가 없습니다. 데이터베이스와 네트워크에 불필요한로드를 부과합니다.

+0

구현 단순화를 위해 sqlconnection 기본 구현에서 연결 풀링을 사용하는 경우 – Svisstack

+0

기본 구현에서 연결 풀링을 사용하는 경우 영구적 인 db 연결을 사용하는 것이 유일한 선택입니다. –

1

"각 레코드 처리"의 의미에 따라 다릅니다. 시간이 오래 걸리며 연결을 유지할 필요가 없다면 연결을 계속 열어 놓고 수영장에서 처리하도록 재고 할 수 있습니다.

그러나 연결을 끊임없이 읽는 경우 인위적으로 연결을 끊거나 다시 연결하면 안됩니다.

관련 문제