采用SqlSugarClient创建数据库实例引发的异步调用问题
基于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