亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 ASP.NET Core SignalR 中管理 DbContext 生命周期

在 ASP.NET Core SignalR 中管理 DbContext 生命周期

C#
紅顏莎娜 2022-12-24 14:15:07
我已經實現了一個 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。閱讀本文了解更多信息。


查看完整回答
反對 回復 2022-12-24
  • 1 回答
  • 0 關注
  • 134 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號