2011-01-12 2 views
1

최근에 새 웹 사이트가 시작되었습니다 ... 피크 시간 동안 약 150 명의 사용자가 활발하게 활동하고 있습니다. 피크 시간에는 몇 분마다 문제가 발생하며 예외 텍스트는 아래에 나와 있습니다.SQL Server 연결 문제

System.Web.HttpUnhandledException: 
Exception of type 'System.Web.HttpUnhandledException' was thrown. 
---> System.Data.SqlClient.SqlException: The client was unable to establish a connection because of an error during connection initialization process before login. 
Possible causes include the following: 
    the client tried to connect to an unsupported version of SQL Server; 
    the server was too busy to accept new connections; 
    or there was a resource limitation (insufficient memory or maximum allowed connections) on the server. (provider: Named Pipes Provider, error: 0 - No process is on the other end of the pipe.) 

데이터 액세스 레이어는 다음 구문을 사용하여 다양한 DataTableAdapter를 호출합니다.

편집

예, da는 DataTableAdapter에 할당 된 이름입니다. DataTableAdapter가 모든 것을 처리하기 때문에 connection.Open()이 없습니다.

<add name="MyConnectionString" 
     connectionString="Data Source=myDBServerName;Initial Catalog=MyDB;User ID=MyUserName;Password=MyPassword" 
     providerName="System.Data.SqlClient" /> 

내가 코드에있는 문제를 배제하기 위해 노력하고있어 :

using(TheDataLayer.some.strongly.typedNameTableAdapters.suchAndSuchTableAdapter da = new TheDataLayer.some.strongly.typedNameTableAdapters.suchAndSuchTableAdapter()) 
     { 
      StronglyTyped.DataTable dt = new StronglyTyped.DataTable(); 
      da.FillByVariousArguments(dt, ..., ...); 
      //da.Dispose(); 

      return something; 
     } 

연결 문자열은 같이 보입니다. 이 문제를 최소화하기 위해 할 수있는 "단순한"것이 있습니까?

감사합니다.

+3

'using' 문을 사용하는 경우 왜 그 안에'Dispose()'를 호출하는 이유가 무엇입니까? –

+1

당신은'conn.Open'이 일어나는 코드를 보여 주어야 할 것입니다. 바로 지금 우리는 그것을 보지 못합니다. 그게 문제가되는 곳입니다. –

+0

네, 이해합니다 .Dispose()는 불필요하고 중복 적이 지 않지만이 문제의 원인이되지는 않습니까? 나는주의의 측면에서 실수하려고 노력했다. 지금은 그 라인을 무시하십시오 ~ – Robert

답변

4

연결 문자열 설정에서 "연결 풀링"을 직접 시도한 적이 있습니까?

예 : 여기에 대한 추가 정보를 읽을 수 있습니다

connectionString="....;Pooling=true;Min Pool Size=1;Max Pool Size=10;..." 

: 실제로 열리고 연결을 사용하는 코드를 보지 않고 http://msdn.microsoft.com/en-us/library/8xx3tyca%28v=vs.71%29.aspx

+0

나는 이것이 올바른 방향으로 나아갈 수있는 것처럼 느낍니다. 최대 풀 크기를 지정하지 않으면 기본값은 100입니까? 그것은 충분히 보인다. 그러나 나는 생산에 다음 추진을 위해 그것을 500 또는 1000까지 끌어 올릴 것이고 그것이 중요한 차이를 만드는 지 알 것이다. – Robert

1

를, 그것이 어디에 문제가 말을하기 어렵다.

DataAdapter를 만들 때 어떤 일이 발생하는지 궁금한 점이 있으시면 (da의 의미입니다).

또한 using 문을 사용하는 경우 using 문을 만든 것에 대한 처분을해서는 안됩니다.

0

실제 발생한 문제와 관련이 없을 수도 있지만 데이터베이스 서버 이름과 함께 올바른 포트를 지정하지 않고 연결하려고하면이 오류가 발생합니다.

+0

이것이 질문에 대한 첫 번째 답변이라는 것을 알 수 있었으므로 담당자에게이 질문을 답글로 게시 할 권한이 없었지만 앞으로는 댓글로 게시하는 것이 좋습니다. 답변은 문제 해결에 도움이 될 것으로 확신합니다. – Fluffeh

1

우리 프로덕션 환경에서만 발생하는 유사한 문제가 있었으며 특히로드와 관련되어있었습니다. 바쁜 시간 동안 우리는 위에서 언급 한 예외 중 몇 가지를 받게 될 것입니다.

왜이 예외가 발생했는지에 대한 대규모 조사를 통해 문제를 해결하기 위해 많은 변경 작업을 수행했습니다. 문제를 해결 한 변경 사항은 풀 크기를 1로 설정하고 최대 풀 크기를 10으로 설정하여 연결 풀 설정입니다 (상황에 따라 다를 수 있음)

이 문제는 몇 가지 문제가있을 때 더 자주 발생합니다. 즉 1000 개의 고객 DB를 사용하고 기본 연결 문자열을 사용합니다 (예 : database = DBName, server = ServerName). 명시 적으로 최소/최대 풀 크기를 설정하지 않았으므로 Min 풀 크기를 0으로 설정하고 최대 풀 크기를 100으로 설정하는 기본 설정이 필요했습니다.

다시 말해서, 이론에 따르면 하루 중 바쁜 시간에로드를 기반으로 DB 서버와 DB 서버에 대한 여러 연결을 여러 데이터베이스에 단일 지점에서 많은 연결 요청으로 포격했습니다. 응용 프로그램 서버 또는 DB 서버에는 짧은 시간 내에 많은 연결을 처리 할 수있는 대역폭이있었습니다. 또한 대부분의 데이터베이스가있는 서버에서 발생했습니다. 한 번에 많은 연결을 볼 수 없었지만 응용 프로그램 서버는 요청이 급증 할 때 짧은 기간 동안 데이터베이스에 연결할 수 없었습니다.

우리는 최소 풀 크기를 설정 한 후이 문제를 유발했습니다. 항상 사용 가능한 각 데이터베이스에 최소한 하나의 연결이 있고 여러 데이터베이스에 연결해야하는 요청이 있으면 우리는 새 데이터베이스를 요청하기 전에 데이터베이스에 최소한 하나의 연결 만 사용할 수 있습니다.