2017-02-22 3 views
0

좋아요, 내 앱을 클라우드로 이동하려는 시도에서 로컬 SQL 데이터베이스를 Azure SQL로 이동했습니다. 문제는 새 Azure SQL 데이터베이스에 대한 연결이 'flakey'라는 것입니다. 다시 집에 가져올 것입니다.Azure SQL 연결 시간이 초과되었습니다.

작업은 데이터베이스에서 총 약 481K 레코드를 루프하고 작성하는 것입니다.

연결 문자열은 때마다 실행되는 SQL 쿼리가 복잡하지

"Server=tcp:xxx,1433;Initial Catalog=xx;Persist Security Info=False;User ID=xx;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;ConnectRetryCount=255;" 

입니다. 3 개의 값을 3 개의 열에 삽입하기 만하면됩니다. (일부 내부 작업을 보호하기 위해 열과 값이 변경됨)

Insert Into TheTable (C1, C2, C3) VALUES ('V1', 'V2', 'V3') 

하지만 무작위로이 점을 던집니다.

System.ComponentModel.Win32Exception (0x80004005) : 대기 작업 시간 초과 실행 시간 제한 만료. 작업이 완료되기 전에 시간 초과 기간이 경과되었거나 서버가 응답하지 않습니다. System.Data.SqlClient.SqlConnection.OnError (SqlException 예외, 부울 breakConnection, 작업 1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 완료, String methodName, 부울 sendToPipe, Int32 시간 초과, 부울 & usedCache, 부울 asyncWrite, 부울 inRetry) at System.Data.SqlClient.SqlCommand .ExecuteNonQuery() XX에서 D에 \ PATHOFTHEFILE :

1) I를 열어 연결을 I 레코드를 만들 때마다 폐쇄하고, 다음 단계에서 그것을 폐쇄있어 그 라인 (420)

참고.

2) 저 외에는 데이터베이스를 공격하는 사람이 없습니다.

3) 데이터베이스 서비스가 S1로 설정됩니다.

4) 예 - 프로그램이 420 행에 충돌한다는 아이러니하게 느껴집니다. 코드를 마약 검사하는 방법을 찾으려고합니다.

질문

1) 연결 문자열에 문제가 있습니까? 설명서에서는 Azure SQL 데이터베이스에 연결할 때 30 초의 시간 제한을 사용해야한다고 말합니다. 솔직히 코드가 0으로 설정된 타임 아웃을했을 때 코드가 더 잘 돌아갔다. (최소한 길게 살았다)

2) 처음에는 단일 연결을 사용하여 전체 481K INSERT 문을 통해 루프를 처리했다. 그게 나쁜 디자인인가요? Azure SQL 안정성은 얼마나 오래 지속될 것입니까?

3) Azure SQL에서 견고한 앱을 제작할 수있는 능력에 대해 따뜻한 느낌을주지 않습니다. 누군가가 로컬 SQL과 Azure SQL을 구축하는 것의 차이점에 대해 좋은 참고 자료를 제공 할 수 있습니까? 나는 내가 찾을 수있는 모든 것을 다 통과 했으므로 그곳에는 그다지 많이 보이지 않았다.

4) 나는 Azure SQL에 MMC를 통해 연결할 수 있다는 사실을 좋아한다. 그러나 MMC에서 더 이상 얻을 수없는 모든 종류의 모니터링 정보가 (일반적으로 말하면) 있습니다.사람은 무서운 푸른 포털

가 UPDATE 번호가 충전

public static void RunSQL(string SQLString) 
     { 

     int a = 0; 

     SqlCommand Command = new SqlCommand(SQLString, TheConnection); 
     try 
      { 
      a = Command.ExecuteNonQuery(); 
      } 
     catch (Exception ex) 
      { 

      Notifications.EventLogging.ProcessEvent(SQLString + " go boom " + ex.InnerException + ex.Message + ex.StackTrace); 
      Notifications.EventLogging.ProcessEvent("Time Of Death" + DateTime.Now); 
      Console.ReadKey(); 

      } 
+0

SqlConnections 및 SqlCommands를 사용하여 데이터베이스에 연결하고 있습니까? 그렇다면 귀하의 문제가 정확히 무엇인지 알고 있습니다. –

+0

유죄로 청구 됨 - 위의 실제 코드 참조 # 1 – TRH

답변

0

푸른 SQL 인스턴스로 1

유죄가 호스팅되는 것을 사용하지 않고 나를 정말 데이터베이스에 무슨 일이 일어나고 있는지 이해하는 데 도움이 할 수있는 무언가에 대한 링크가 공유 인프라에서. Azure는 서버의 모든 인스턴스가 최소 SLA를 충족시킬 수 있도록 요청을 제한합니다. 이 세상에서 죽음과 세금은 보장되지만 Azure SQL 연결은 보장되지 않습니다.

이 문제를 처리하려면 자동 재시도가 필요합니다. Microsoft는 현재 사용되지 않는 ReliableSqlConnection 클래스부터 몇 가지 옵션을 제공합니다. 요즘 Azure SQL과 대화하는 데 선호되는 방법은 자동 재시도 기능이 내장 된 Entity Framework 6.x를 사용하는 것입니다.

실제로 가벼운 트래픽과 산발적 인 트래픽을 보는 Azure SQL 데이터베이스는 거의 스로틀 이벤트를 볼 수 없습니다. Azure SQL 데이터베이스를 사용하는 프로덕션 코드를 배포하고 원시 SqlConnections 및 SqlCommands를 사용하는 개발자 친구가 있었으며 연결이 보장되지 않는다고 말할 때 진정으로 놀랐습니다. 그들은 결코 그것을 가로 지르지 않을 것입니다! 그러나 서버에서 지옥을 치고 있다면 (그렇게하고있는 것처럼) 눈에 띄기에 충분하다는 것을 알았습니다.

EF6로 전환하면 문제가 해결됩니다.

+0

알겠습니다. 알겠습니다. 하지만이 서버 인스턴스 (S1)에 대해 DTU가보고 있으며 사용 가능한 DTU의 약 20 % -30 %를 초과하는 것으로 보이지 않습니다. Azure가 연결을 끊기 전에 DTU가 100 %를 맞추어야한다고 생각합니다. 결국, 서버 파문의 수준을 조정할 수있는 DTU 수준이 다릅니다. 단기적인 수정으로, 반복간에 Thread.Sleep을 시도하여로드를 줄이는 지 확인합니다. 주말 프로젝트로 EF 변환을 시도해 보겠습니다. – TRH

+0

"DTU"는 Microsoft에서 아직 발표하지 않은 여러 가지 측정 항목으로 구성된 구성된 측정 항목입니다. DTU가 고정되지 않았다고해서 조절되지 않는 것은 아닙니다. 다음은 Azure SQL을 사용할 때 EF의 기능과 필요성을 다루는 페이지입니다. https://msdn.microsoft.com/en-us/library/dn456835(v=vs.113).aspx –

+0

예 - 저였습니다. 두려움 - 전체 DTU 규모에 DTU를 표시하지 않고 DTU를 구성하는 정의되지 않은 매개 변수 중 하나를 pegging했습니다. 이번 주말에 귀하의 링크를 읽어야합니다. – TRH

관련 문제