[FIXED] ASP, EF mit Beziehungen: Nach dem Einsatz kann nicht auf API zugreifen

Ausgabe

Die API hat am Anfang kein Problem, es funktionierte gut. Aber als immer mehr Daten in der Datenbank (Mariadb) angesammelt wurden, die Veranstaltungsteilnehmer ihre Workshop-Daten, wie ihre Anwesenheitslisten, ihre Verlaufssitzungen, nicht bekommen können, versagt die API.

Ich habe versucht, es zu lösen, aber keine Lösung gefunden. Wie kann ich dieses Zeitüberschreitungsproblem lösen?

[HttpGet]
[Authorize(Roles = "Admin,Participant")]
[ValidateReferrerAttribute]
public async Task<ParticipantSessionDto> GetSessions()
{
    if (User.Identity is { IsAuthenticated: true })
    {
        var configuration = new MapperConfiguration(
            cfg => cfg.CreateProjection<Participant, ParticipantSessionDto>());

        return await _entities
            .AsNoTracking()
            .Include(x => x.CheckIns)
                .ThenInclude(x => x.Session)
            .Include(x => x.Events)
            .Include(x => x.Sessions)
                .ThenInclude(x => x.Event)
            .Include(x => x.Sessions)
                .ThenInclude(x => x.Speakers)
                .ThenInclude(x => x.Avatar)
            .Include(x => x.Sessions)
                .ThenInclude(x => x.Materials)
            .ProjectTo<ParticipantSessionDto>(configuration)
            .FirstAsync(x => x.UserName == User.Identity.Name);
    }

    return null;
}

Das Ausnahmeprotokoll

MySqlConnector.MySqlException (0x80004005): The Command Timeout expired before the operation completed.
     ---> System.Net.Sockets.SocketException (125): Operation canceled
       at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
       at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource<System.Int32>.GetResult(Int16 token)
       at MySqlConnector.Protocol.Serialization.SocketByteHandler.DoReadBytesAsync(Memory`1 buffer) in /_/src/MySqlConnector/Protocol/Serialization/SocketByteHandler.cs:line 109
       at MySqlConnector.Protocol.Serialization.SocketByteHandler.DoReadBytesAsync(Memory`1 buffer) in /_/src/MySqlConnector/Protocol/Serialization/SocketByteHandler.cs:line 109
       at MySqlConnector.Protocol.Serialization.BufferedByteReader.ReadBytesAsync(IByteHandler byteHandler, ArraySegment`1 buffer, Int32 totalBytesToRead, IOBehavior ioBehavior) in /_/src/MySqlConnector/Protocol/Serialization/BufferedByteReader.cs:line 34
       at MySqlConnector.Protocol.Serialization.ProtocolUtility.<ReadPacketAfterHeader>g__AddContinuation|2_0(ValueTask`1 payloadBytesTask, Int32 payloadLength, ProtocolErrorBehavior protocolErrorBehavior, Exception packetOutOfOrderException) in /_/src/MySqlConnector/Protocol/Serialization/ProtocolUtility.cs:line 434
       at MySqlConnector.Protocol.Serialization.ProtocolUtility.<DoReadPayloadAsync>g__AddContinuation|5_0(ValueTask`1 readPacketTask, BufferedByteReader bufferedByteReader, IByteHandler byteHandler, Func`1 getNextSequenceNumber, ArraySegmentHolder`1 previousPayloads, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior) in /_/src/MySqlConnector/Protocol/Serialization/ProtocolUtility.cs:line 480
       at MySqlConnector.Core.ServerSession.ReceiveReplyAsyncAwaited(ValueTask`1 task) in /_/src/MySqlConnector/Core/ServerSession.cs:line 956
       at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in /_/src/MySqlConnector/Core/ResultSet.cs:line 133
       at MySqlConnector.MySqlDataReader.ActivateResultSet(CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlDataReader.cs:line 108
       at MySqlConnector.MySqlDataReader.CreateAsync(CommandListPosition commandListPosition, ICommandPayloadCreator payloadCreator, IDictionary`2 cachedProcedures, IMySqlCommand command, CommandBehavior behavior, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlDataReader.cs:line 456
       at MySqlConnector.Core.CommandExecutor.ExecuteReaderAsync(IReadOnlyList`1 commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/CommandExecutor.cs:line 56
       at MySqlConnector.MySqlCommand.ExecuteReaderAsync(CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlCommand.cs:line 331
       at MySqlConnector.MySqlCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlCommand.cs:line 323
       at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
       at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
       at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.InitializeReaderAsync(AsyncEnumerator enumerator, CancellationToken cancellationToken)
       at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken)
       at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
       at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
       at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
       at EventManager.Server.Controllers.ParticipantController.GetSessions() in C:\Users\CMSB\Desktop\EventManager\EventManager.Server\Controllers\ParticipantController.cs:line 173

Bearbeiten:
Ich habe auch ein Problem beim Abfragen der Dashboard-API.
Früher hat es am Anfang funktioniert, aber wenn ich den Server nach einer Weile einsetze, kann ich jetzt nicht einmal das Dasboard abrufen.

Dies ist die Get-Anforderung für das Dashboard:

[HttpGet]
[Authorize(Roles = "Admin")]
[ValidateReferrerAttribute]
public async Task<Event> GetForDashboard(Guid id)
{
    if (await _entities.AnyAsync(x => x.EventId == id))
    {
        var data = await _entities
            .AsNoTracking()
            .Include(x => x.CheckIns)
                .ThenInclude(x => x.Participant)
            .Include(x => x.Participants)
                .ThenInclude(x => x.Feedbacks)
            .Include(x => x.Sessions)
                .ThenInclude(x => x.Speakers)
            .Include(x => x.Sessions)
                .ThenInclude(x => x.Participants)
            .Include(x => x.Sessions)
                .ThenInclude(x => x.CheckIns)
                .ThenInclude(x => x.Participant)
            .FirstAsync(x => x.EventId == id);

        return data;
    }

    return null;
}

Lösung

Wenn Sie mehrere Sammlungen einbeziehen, können Sie versuchen .AsSplitQuery(), die Leistung zu verbessern. Dokumentation . Profilieren Sie wie immer, um zu sehen, ob es Ihren Fall wirklich verbessert.


Beantwortet von –
Carles Company


Antwort geprüft von –
David Goodson (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like