我已經實現了一個 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 關注
- 134 瀏覽
添加回答
舉報
0/150
提交
取消