C# 在ASP.NET核心信号器中管理DbContext生存期
我已经实现了一个ASP.Core信号器应用程序 共享集线器类每10秒向其所有客户端调用一个信号 从类C# 在ASP.NET核心信号器中管理DbContext生存期,c#,asp.net-core,signalr,C#,Asp.net Core,Signalr,我已经实现了一个ASP.Core信号器应用程序 共享集线器类每10秒向其所有客户端调用一个信号 从类SharedHub(该类不是从Hub继承的,它具有获取IHubContext以调用的逻辑) 同样在同一个类中,一旦一个新连接建立了一个方法来更新数据库 public void UpdateSocketConnection(int connectionId){ var connection =_context.connection; connection.id = connectio
SharedHub
(该类不是从Hub
继承的,它具有获取IHubContext
以调用的逻辑)
同样在同一个类中,一旦一个新连接建立了一个方法来更新数据库
public void UpdateSocketConnection(int connectionId){
var connection =_context.connection;
connection.id = connectionId;
_context.saveChanges();
}
此实现的问题在于,如果连接当前正在调用Tick()
方法,并且客户端也同时连接<代码>\u上下文抛出一个错误,说明:
_使用中的上下文
(我将在复制后更新确切的错误消息)
我做了什么
我已经实现了一个工厂方法,以在每个方法之上获得一个新的\u context
实例
public void Tick(){
var time = factory.GetContext().time;
invoke('tick', time.tick);
}
public void UpdateSocketConnection(int connectionId){
var context = Factory.getContext();
var connection =context.connection;
connection.id = connectionId;
context .saveChanges();
}
这实际上解决了问题。但这似乎不是正确的做法。我不确定每次在每个方法之上获取新上下文时的性能。这似乎是不好的做法
我想知道这个场景的可能实现是什么 在第一种方法中,操作之间同时共享
DbContext
,这会导致错误和意外结果。为了避免在第二种方法中每次都创建和处理DbContext
,DbContextPooling
可以提高性能
可以创建一个可重用实例池。它不会处理实例,而是返回池并将实例重置为其默认状态。因此,代码将首先检查池中是否有可用实例,而不是每次都创建一个新实例
您可以在startup
类中的Configure
方法中启用DbContextPooling
:
services.AddDbContextPool<YourContext>(options => options.UseSqlServer(connection));
services.AddDbContextPool(options=>options.UseSqlServer(connection));
默认池大小值为128。阅读以了解更多信息。能否显示中心声明和
\u上下文的初始化?
services.AddDbContextPool<YourContext>(options => options.UseSqlServer(connection));