在EF Core 2.2中执行SQL存储过程在SQL Server Management中成功执行时会超时

时间:2020-02-05 10:45:10

标签: c# sql-server asp.net-core stored-procedures ef-core-2.2

我有一个奇怪的行为。当我尝试通过EF Core 2.2执行SQL存储过程时。我超时(30秒)。但是,当我在SQL Server Management Studio中执行相同的过程时,它可以成功运行-它运行大约1或2秒。

更新:此问题大约在2个月前发生。在此之前,该服务能够运行此proc。

这是我使用的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);
        }
    }
}

这里是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 个答案:

答案 0 :(得分:1)

问题可能出在我注册时使用AddSingleton ContextBuilder?

否,因为ContextBuilder中的一种方法不执行数据库操作,并且一直没有返回相同的上下文。

但是当我在SQL Server Management Studio中执行相同的过程时,它将运行 成功

需要多长时间?据我所知,SSMS并没有施加超时限制,这将告诉您为什么您没有超时。除非您进行更改,否则EfCore的限制为30秒-根据文档,这是微不足道的,但必须这样做。

这里的概念是,SSMS在EfCore上比在EfCore上更多地用于批量操作,在EfCore上30秒的操作可以被视为错误-在少数情况下,您需要/需要更长的超时时间,请重新配置dbcontext。

答案 1 :(得分:0)

我有同样的问题。我浏览了以下链接:

Stored procedure slow when called from web, fast from Management Studio

我已经这样修改了sp:

更改程序[dbo]。[存储] @ param1 int, 如 SELECT * FROM Table WHERE ID = @ param1

更改程序[dbo]。[存储] @ param1 int, 如 宣告@ param1a int 设置@ param1a = @ param1 选择*从表WHERE ID = @ param1a

对我来说,它工作正常。