框架升级到7.0后,经常出现服务崩溃的问题,频繁到几乎五分钟一次...然后开始盯日志,得到以下下几种异常:
- MySqlConnection is already in use. See https://fl.vu/mysql-conn-reuse
- SqlSugar.SqlSugarException: Cannot Open when State is Connecting.
- The current TransactScope is already complete
修复步骤1 SqlSugarSvope先测安全对象可能避免大多数的先测安全问题
1.SqlsugarClient换成SqlSugarScope(SqlSugarScope要用单列 不然内存会增加)
2.多租户db.getConnection换成db.GetConnectionScope(AOP也要统一不然时间注册不了)
钟点:SqlSUgarScope一定要用单列
步骤1不行继续往下
修复步骤2
1.异步方法不写await 需要db替换成db.CopyNew() 不想加CopyNet就取排查是否有异步async方法 漏写await
2.task.WhenAll必须要用 task.run(asunc=>await 异步方法) 必须要用task.run 包一层(copynew也可以)
3.表达使中用比喻 注意action的表达使禁止用异步 需要func<task>这种类型才能用异步
第3点错误代码例子:data.List.Foreach(async=> it.Button=await GetButtionList())简单总结下:SqlSugar会有偶发的线程安全问题,如果遇到了, 第一步检查有没有漏 await 关键字, 第二步看方法返回的是不是 Task 类型,void不会进行上下文切换,线程失联就可能出现上面三点异常, 最后 ForEach 是假异步,除非微软除了 ForeachAsync 否则永远不要用
需要优化成
foreach(var item in data.List) { item.Button=await getButtonList(item); }
sqlsugarclient一旦发生上下文切换就会出现偶发性错误 这个上下文是sqlsugarclient上下文 不是线程上下文 lambda,异步,迭代器这三个东西不要一块写,这个坑MSDN明确说过 标签:异步,already,await,db,State,报错,上下文,SqlSugar From: https://www.cnblogs.com/LZXX/p/17081426.html