我已经实现了一个 ASP.Core SignalR 应用程序。一个共享集线器类每 10 秒从类中调用一个信号给它的所有客户端SharedHub(这个类不是从它继承的,Hub它有IHubContext调用的逻辑)public void Tick(){ var time = _context.table.time; invoke('tick', time.tick);}同样在同一个类中,一旦建立了新连接,就会调用一个方法来更新数据库public void UpdateSocketConnection(int connectionId){ var connection =_context.connection; connection.id = connectionId; _context.saveChanges();}这个实现的问题是,如果连接当前正在调用Tick()方法并且同时连接了一个客户端。_context抛出一个错误说:_context 正在使用中。(我将在重现后更新确切的错误消息)。我做了什么 ?_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();}这实际上解决了问题。但这似乎不是正确的做法。我不确定每次在每种方法之上获取新上下文时的性能。这似乎是不好的做法。我想知道这种情况的可能实现方式是什么。
1 回答
守着星空守着你
TA贡献1799条经验 获得超8个赞
在第一种方法DbContext
中,同时在操作之间共享它会导致错误和意外结果。避免DbContext
在第二种方法中每次都创建和处理,DbContextPooling
可以帮助提高性能。
可以创建可重用实例池。它不会处理实例,而是返回池并将实例重置为其默认状态。因此,代码不会每次都创建一个新实例,而是首先检查池中是否有可用实例。
您可以在类DbContextPooling
中的Configure
方法中启用startup
:
services.AddDbContextPool<YourContext>(options => options.UseSqlServer(connection));
默认池大小值为 128。阅读本文了解更多信息。
- 1 回答
- 0 关注
- 105 浏览
添加回答
举报
0/150
提交
取消