programing

데이터베이스를 계속 연결할 때 오류 발생

minimums 2023. 4. 28. 20:24
반응형

데이터베이스를 계속 연결할 때 오류 발생

연속 루프 상태에서 데이터베이스에서 쿼리할 때 다음 오류가 발생합니다.

일시적인 오류로 인해 발생할 수 있는 예외가 발생했습니다.SQL Azure 데이터베이스에 연결하는 경우 Sql Azure 실행 전략을 사용해 보십시오.

정상적으로 작동하고 있습니다.

EF Core를 사용하는 경우 복원 연결에 대한 실패 시 재시도 구성:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer("your_connection_string", builder =>
        {
            builder.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null);
        });
    base.OnConfiguring(optionsBuilder);
}

SQL 데이터베이스에 연결할 때 일시적인 연결 실패를 고려해야 합니다.이러한 연결 실패는 예를 들어 업데이트가 롤아웃되거나 하드웨어 장애 등이 발생할 수 있습니다.표시된 오류는 이러한 문제 중 하나가 발생하여 연결이 끊어졌음을 나타냅니다.Anbuj가 제안한 실행 전략을 활성화하면 문제가 해결될 것입니다.

여기에 언급된 대로 실행 전략을 활성화합니다. https://msdn.microsoft.com/en-us/data/dn456835.aspxAzure SQL DB를 위해 설계할 때는 백엔드 업데이트, 하드웨어 오류, 로드 밸런싱으로 인해 때때로 간헐적인 오류가 발생할 수 있으므로 일시적인 연결 오류를 설계해야 합니다.

Entity Framework의 경우 EF 코어가 아닌 아무도 솔루션을 넣지 않았다는 것을 알 수 있었습니다.SqlAzure 실행 전략을 구현하는 가장 쉬운 방법은 다음과 같습니다.

  1. .cs 합니다. Context.cs 파일은 다음과 같습니다.public partial class YourEntity : DbContext

  2. 합니다.using System.Data.Entity.SqlServer;

  3. 다음 코드를 포함하는 다른 클래스를 파일 끝에 추가합니다.

    public MyConfiguration()
    {
        SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
        SetDefaultConnectionFactory(new LocalDbConnectionFactory("mssqllocaldb"));
    }
    

자세한 내용은 이 설명서를 참조하십시오.

해당 이슈에 대한 답변을 조사하는 과정에서 많은 이슈에 직면하게 되어 이 답변을 올립니다.다음은 제가 받은 자세한 오류 메시지입니다.

오류가 너무 길기 때문에 부품의 오류를 나누는 것:

  1. 시스템. 데이터.엔티티. 코어.엔티티 예외: *일시적 오류로 인해 발생할 있는 예외가 발생했습니다. SQL Azure 데이터베이스에 연결하는 경우 Sql Azure 실행 전략을 사용해 보십시오. * --->

  2. 시스템. 데이터.엔티티. 코어.엔티티 명령실행예외:명령 정의를 실행하는 동안 오류가 발생했습니다.자세한 내용은 내부 예외를 참조하십시오. ---> 시스템Data.SqlClient.SqlException:리소스 ID: 1. 데이터베이스에 대한 요청 제한은 30이며, 이에 도달했습니다.자세한 내용은 'http://go.microsoft.com/fwlink/ ?LinkId=267637'을 참조하십시오.시스템에서.Data.SqlClient.SqlConnection.OnError(SqlException 예외, 부울 breakConnection, Action '1 wrapCloseInAction)

조사 결과 Azure SQL Database 최대 로그인 수 제한과 관련이 있는 것으로 확인되었습니다.나는 '기본' 서비스 타이어를 사용하고 있었고 최대 동시 사용자 수는 30명입니다.

Azure에는 성능에서 상당히 큰 차이를 보이는 가격 계층이 있습니다.이를 위해 CPU 전원, 분당 요청 수 등 많은 성능 메트릭을 제한합니다.

즉, 계층을 넘겨 처리하는 경우 CPU 성능/요청 볼륨이 너무 높아 요청이 대기열에 오르기 시작합니다.이렇게 하면 시간이 초과되고 요청이 처리되기를 기다리는 동안 요청 제한이 커집니다.결국 데이터베이스가 다운되는 지점에 도달합니다.

제 경험에 따르면 S0 및 S1과 같은 하위 데이터베이스 수준은 전력이 부족하며 개발 또는 매우 기본적인 사이트 이외의 용도로 사용해서는 안 됩니다.

Azure 포털에는 CPU 그래프, 인덱스 어드바이저 및 쿼리 성능 통찰력과 같이 데이터베이스에서 발생하는 상황을 디버깅할 수 있는 몇 가지 훌륭한 도구가 있습니다.

다음은 관련 링크입니다.

결론:

  • 1부: https://msdn.microsoft.com/en-us/data/dn456835.aspx 에서 언급한 대로 실행 전략을 실행합니다.

  • 파트 2: Azure에서 서브스크립션을 업그레이드해야 합니다(가격이 허락하는 경우).

감사해요.

TLS 설정 때문일 수 있습니다. .net 4.5 프레임워크는 기본적으로 tls 1.2를 지원하지 않으며 새 SQL db는 이전 tls ver.와 호환되지 않으므로 시스템에서 tls 1.0,1.1을 사용하지 않도록 설정하거나 .net 4.6.2로 업데이트하십시오.

저처럼 Azure의 데이터베이스나 클라우드의 다른 플랫폼과 상호 작용해야 하는 상황이 아님에도 불구하고 이러한 오류가 발생한 사람들에게 저의 기여를 하고 싶습니다.

첫 번째 목표는 문제의 정확한 원인을 찾는 것입니다. 저처럼 많은 사람들이 예외 텍스트와 1마일 길이의 스택 추적 문자열과 충돌했을 것입니다.연결을 닫기 전에 데이터베이스 공급자가 발급하는 실제 메시지에 접근하기 위해 Inner Exceptions의 matryoshka를 처리하는 것이 유용했습니다(메시지가 표시될 때 활성화되었습니다!).또는 가능한 경우 진행 중인 TSQL 작업에 연결된 오류를 확인할 수 있는 외부 도구(예: SQL Server Profiler)를 통해 데이터베이스에 대한 트랜잭션을 모니터링하는 것으로 충분합니다.

제 경우 시나리오는 다음과 같습니다. 테이블 내에 레코드를 삽입하는 동일한 프로그램(Windows 서비스)의 두 인스턴스입니다.두 가지 특징:

  • Windows 서비스(예: Form 또는 WPF 데스크톱 애플리케이션)의 경우 DbContext의 수명 주기가 일반적으로 더 길며 프로젝트 전체 기간 동안 활성 상태로 유지하기보다는 처리 중인 Form에 연결할 수 있습니다. 이때까지 값이 매겨진 캐시를 삭제하기 위해 정기적으로 새로 고치는 선견지명이 있습니다.
  • 대상 테이블에는 자체 자동 증분(확장) 키 필드가 있습니다.

이 시나리오에서는 모든 서비스의 인스턴스가 동시에 동일한 테이블을 작성하려고 하고 EF6를 사용하여 수행되는 각 쓰기 작업은 ID를 나타내는 키 필드를 검색하고 향상시키기 위해 쿼리 내에서 매우 특별한 선택 항목을 생성합니다.이와 같은 것:

INSERT [dbo].[People]([Name]) VALUES (@0)
SELECT [Id], [SomeId]
FROM [dbo].[People]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()

내 코드는:

People entry = new People();
entry.name = "ABCD";
_ctx.Set<People>().Add(entry);
await _ctx.SaveChangesAsync();

이러한 유형의 쓰기는 두 프로세스(특히 테이블에 약 5M개의 레코드가 있는 경우) 간의 동시성을 초래하여 SQL 엔진이 한 요청을 해결하고 다른 요청을 취소하도록 유도합니다.호출 프로그램의 해석은 정확하게 "일시적인 오류로 인해 발생할 수 있는 예외가 발생했습니다. SQL Azure 데이터베이스에 연결하는 경우 Sql Azure 실행 전략을 사용하는 것이 좋습니다.

문제를 해결하기 위해 새 레코드에 할당된 증분 ID의 복구를 포기해야 했습니다. 테이블을 스택으로 처리하고 다음을 사용하여 쓰기 작업을 직접 삽입 작업으로 축소했습니다.

await _ctx.Database.ExecuteSqlCommandAsync("INSERT INTO ....");

또는 EFSQL 파서를 포함하지 않는 두 개의 쓰기 작업으로 작업을 세분화하고 마지막으로 추가된 레코드에 할당된 식별자를 검색할 수 있습니다.

데이터베이스에 연결하려는 로그인에 데이터베이스에 연결된 사용자가 없을 때 이 오류가 발생합니다.

내 경우 이 버그는 대기 시간 누락으로 인해 쿼리 실행 도중 컨텍스트를 삭제하여 발생했습니다.

예를 들어, WebAPI와 같은 데이터베이스가 로컬인 경우 IP 주소가 아닌 data source=localhost를 제공해야 하는 경우가 있습니다.일부 VPS를 사용하고 있는데 데이터 소스를 localhost로 설정하지 않으면 이 오류가 발생합니다.다른 사람들이 이런 경험을 했다면 도움이 될 겁니다

답을 입니다.SetExecutionStrategy()재시도 정책을 설정합니다. 꼭 .DbConfigurationEntity Framework가 메서드를 자동으로 실행할 수 있도록 합니다.

또한 연결 오류를 발생시키는 명령 가로채기를 설정하여 연결 복원력이 제대로 작동하는지 확인하려고 합니다.

일시적인 연결 오류 처리 방법에 대한 자세한 정보

efcore 2.2로 sp 결과를 얻으려고 할 때 이 오류가 발생하여 sp 문제가 해결되기 시작할 때 이 코드를 사용하려고 합니다.

ALTER procedure [dbo].[getusers]
@param int
As
Set transaction isolation level read uncommitted
.
.

.

프로젝트가 개발 모드에서 실행되도록 구성했습니다.그러나 알 수 없는 이유로 항상 프로덕션 모드에서 실행됩니다.

즉, 앱 설정연결 문자열을 사용합니다.Production.json 파일.이 파일의 연결 문자열이 프로덕션 서버를 가리키고 프로덕션 서버에 연결할 수 없기 때문에 이 오류가 발생합니다.임시로 이 파일의 이름을 바꾸고 앱 설정사용합니다.development.json이 해결해 줄 것입니다.

언급URL : https://stackoverflow.com/questions/29840282/error-when-connect-database-continuously

반응형