??基于SqlSugar編寫的多個WebApi接口,項目初始化時采用單例模式注冊SqlSugarClient實例對象,前端頁面采用layui布局,并在一個按鈕事件中通過Ajax連續調用多個WebApi接口獲取數據。實際運行時點擊按鈕會隨機報下面幾種錯誤:
ExecuteReader requires an open and available Connection,The connection's current state is closed
Invalid operation.The connection is closed
There is already an open DataReader associated with this connection which must be close first
??搜索上述錯誤信息,發現和異步調用有關。Ajax調用WebApi默認采用異步方式,同一個函數中先后用Ajax調用WebApi接口,后臺都是使用同一個SqlSugarClient實例,所以才會出現上述錯誤。下圖是DeepSeek給出的SqlSugar中SqlSugarClient和SqlSugarScope的區別,同時從參考文獻1中可以看到SqlSugarClient不適合單例模式,而是適合每次請求new一個新對象,單例模式更適合使用SqlSugarScope。
??要解決上述問題可以采用以下三種方法:
??1)Ajax調用WebApi時增加設置async:false,取消異步調用,但多終端連接時也可能會出問題;
??2)將SqlSugarClient換為SqlSugarScope;
?? 3)參照SqlSugar官網文檔采用原生模式使用SqlSugarClient。
??第三條沒有試過,不確定是否能解決并發問題。由于沒有性能上的要求,我是采用第二種方式簡單粗暴的解決問題。
參考文獻:
[1]https://www.donet5.com/Doc/1/1180