我有一个奇怪的行为。当我尝试通过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
吗?
有人可以指出我如何在哪里调查问题吗?
答案 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
对我来说,它工作正常。