.net升级7.0报错1. MySqlConnection is already in use. See https://fl.vu/mysql-conn-reuse 2.SqlSugar.SqlSugarException: Cannot Open when State is Connecting. 3.The current TransactScope is already complete

框架升级到7.0后,经常出现服务崩溃的问题,频繁到几乎五分钟一次...然后开始盯日志,得到以下下几种异常:
  1. MySqlConnection is already in use. See https://fl.vu/mysql-conn-reuse
  2. SqlSugar.SqlSugarException: Cannot Open when State is Connecting.
  3. 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())
需要优化成     
foreach
(var item in data.List) { item.Button=await getButtonList(item); }
简单总结下:SqlSugar会有偶发的线程安全问题,如果遇到了,
第一步检查有没有漏 await 关键字,
第二步看方法返回的是不是 Task 类型,void不会进行上下文切换,线程失联就可能出现上面三点异常,
最后 ForEach 是假异步,除非微软除了 ForeachAsync 否则永远不要用

 

  
sqlsugarclient一旦发生上下文切换就会出现偶发性错误  
这个上下文是sqlsugarclient上下文 不是线程上下文
lambda,异步,迭代器这三个东西不要一块写,这个坑MSDN明确说过
posted @ 2023-02-01 09:17  12不懂3  阅读(1764)  评论(0编辑  收藏  举报
创作不易,请勿抄袭,欢迎转载!