Выполнение SQL хранимой процедуры в EF Core 2.2 получает тайм-аут при успешном выполнении в SQL Управление сервером - PullRequest
0 голосов
/ 05 февраля 2020

У меня странное поведение. Когда я пытаюсь выполнить SQL процедуру сохранения EF Core 2.2. Я получаю тайм-аут (30 секунд). Но когда я выполняю ту же процедуру в SQL Server Management Studio, она запускается успешно - она ​​запускает ее примерно за 1 или 2 се c.

ОБНОВЛЕНИЕ: Эта проблема возникла около 2 месяцев а go. До этого сервис смог запустить этот профи c.

Вот DbContext, которое я использую:

public class MyContext : DbContext
{
    public MyContext(string connectionString)
        : base(new DbContextOptionsBuilder().UseSqlServer(connectionString).Options)
    {
    }

    // some DbSets omitted here ...

    public async Task<string> ProcExecuteAsync(string login, string xml)
    {
        // get some data from db (omitted)

        var xmlParameter = new SqlParameter("@XML", SqlDbType.Xml) { Value = xml };
        var xmlOutputParameter = new SqlParameter("@XMLoutput", SqlDbType.Xml) { Direction = ParameterDirection.Output };

        await Database.ExecuteSqlCommandAsync(
            "MyProc_set @idUser=@idUser,@XML=@XML,@XMLoutput=@XMLoutput OUT",
            new SqlParameter[] { userIdParameter, xmlParameter, xmlOutputParameter });

        return (string)xmlOutputParameter.Value;
    }
}

Затем у меня есть обработчик (я использую Mediator библиотеку):

public class AddToClientCommandHandler : IRequestHandler<AddToClientCommand, AddToClientResponse>
{
    private readonly IContextBuilder _contextBuilder; 

    public AddToClientCommandHandler(IContextBuilder contextBuilder)
    {
        _contextBuilder = contextBuilder;
    }

    public async Task<AddToClientResponse> Handle(AddToClientCommand command, CancellationToken cancellationToken)
    {
        using (var context = _contextBuilder.CreateMyContext())
        {
            // getting some data from db (omitted)

            // generate xmlRequest (omitted)

            var result = await context.ProcExecuteAsync(command.Login, xmlRequest);
            return new AddToClientResponse(result);
        }
    }
}

Вот a ContextBuilder:

public class ContextBuilder : IContextBuilder
{
    private readonly IOptions<ConnectionStrings> _connectionStrings;

    public ContextBuilder(IOptions<ConnectionStrings> connectionStrings)
    {
        _connectionStrings = connectionStrings;
    }

    public MyContext CreateMyContext()
    {
        var result = new MyContext(_connectionStrings.Value.Entities);
        return result;
    }
}

И я регистрирую это так:

public static class ApplicationContextBuilderExtension
{
    public static void AddApplicationContextBuilder(this IServiceCollection services)
    {
        services.AddSingleton<IContextBuilder, ContextBuilder>();
    }
}

Возможно ли, что проблема связана с тем, что я использую AddSingleton при регистрации ContextBuilder ?

Может кто-нибудь подсказать мне, как и где исследовать проблему?

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Возможно ли, что проблема связана с тем, что я использую AddSingleton при регистрации ContextBuilder?

Нет, поскольку один метод в ContextBuilder не выполняет операции с БД и не возвращает все время в одном и том же контексте.

Но когда я выполняю ту же процедуру в SQL Server Management Studio, она успешно работает

И сколько времени это займет? Насколько мне известно, SSMS не налагает и ограничение по времени ожидания, которое скажет вам, почему вы не получите время ожидания. EfCore ограничен 30 секундами, ЕСЛИ ВЫ НЕ ИЗМЕНИТЕ ЭТО - что является тривиальным в соответствии с документацией, но это необходимо сделать.

Концепция здесь заключается в том, что SSMS более широко используется для массовых операций, чем EfCore, где 30-секундная операция может считаться ошибкой - и в тех редких случаях, когда вам нужно / нужно увеличить время ожидания, перенастройте dbcontext.

0 голосов
/ 05 февраля 2020

У меня та же проблема. Я прошел по следующей ссылке:

Хранимая процедура при вызове из Интернета, быстрая из Management Studio

Я изменил sp следующим образом:

ALTER PROCEDURE [dbo]. [Sproc] @ param1 int, AS SELECT * Из таблицы, где ID = @ param1

до

ALTER PROCEDURE [dbo]. [Sproc] @ param1 int, AS ОБЪЯВИТЬ @ param1a int SET @ param1a = @ param1 SELECT * FROM Table WHERE ID = @ param1a

Для меня все работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...