GetConnectionScope 不是线程安全的 返回

以下代码会出现异常:提示 data configid 找不到
Parallel.ForEach(list, item =>
{
var baseinfo = DbScope.GetConnectionScope("data")
.SqlQueryable<object>($"select company_id from baseinfo_business_snapshot where uniscid='{uniscid}'");
});
热忱回答(21)
-
badman VIP0
2024/12/27刚刚测试了一下, scope.CopyNew() 会获取一个 client,这个client 在 Parallel.ForEach 内部执行 GetConnection("data") 、GetConnectionScope("data") 也都会报错 “SqlSugar.SqlSugarException:“ConfigId was not found data””,,
0 回复 -
kldxsg VIP0
2024/12/27我也发现了,用的是 sugar.ioc
0 回复 -
badman VIP0
2024/12/27@kldxsg:
感觉 sugarsql 需要重构了,虽然很多方法是public,比较灵活,但是 灵活的有点过头了,scope CopyNew() 就不应该存在,既然是单例,就不应该CopyNew,如果非要CopyNew 也应该new 出来 Scope 而不是 client, 现在比较混乱,scope 和 client 很多方法交织在一起,特别是 connection provider 这些,试错学习成本有点太高了
0 回复 -
kldxsg VIP0
2024/12/27不对啊,我是写错没找到,不知道你那里啥错误
0 回复 -
badman VIP0
2024/12/27@kldxsg:Parallel.ForEach 你可以测试一下在 这个多线程里 执行 getconnection 试试,百分百会报错提示找不到
0 回复 -
fate sta VIP0
2024/12/270 回复 -
fate sta VIP0
2024/12/27如果用了addConnection一定要在同一个上下文才能GetConnection
0 回复 -
fate sta VIP0
2024/12/27第二 并发函数里要加CopyNew
var baseinfo = DbScope.CopyNew().GetConnection("data") //CopyNew出来不能用Scope
0 回复 -
fate sta VIP0
2024/12/27如果还有疑问提供完整DEMO
0 回复 -
fate sta VIP0
2024/12/270 回复 -
badman VIP0
2024/12/27@fate sta:
你看看这个demo行不行? 多线程环境内无法正常获取 GetConnectionScope
0 回复 -
badman VIP0
2024/12/27@fate sta:多数据库,Task.When Paral.For 等 执行 db.CopyNew() 的前提是需要先 getConnection 后在 copynew,现在这个 getconnection 直接就报错了,
0 回复 -
kldxsg VIP0
2024/12/27@badman:
SugarIocServices.AddSqlSugar(new IocConfig() { ConfigId = "db01", ConnectionString = "Data Source=192.168.1.5;Port=3306;User ID=root;Password=123456; Initial Catalog=test;Charset=utf8mb4;Allow User Variables=True;SslMode=none;allowPublicKeyRetrieval=true;Min pool size=1", DbType = IocDbType.MySqlConnector, IsAutoCloseConnection = true//自动释放 }); SugarIocServices.ConfigurationSugar(sugar => { sugar.AddConnection(new SqlSugar.ConnectionConfig { ConfigId = "db02", ConnectionString = "Data Source=192.168.1.6;Port=3306;User ID=root;Password=123456; Initial Catalog=test;Charset=utf8mb4;Allow User Variables=True;SslMode=none;allowPublicKeyRetrieval=true;Min pool size=1", }); }); var app = builder.Build(); Parallel.For(0, 2, (i) => { var gg = DbScoped.SugarScope.GetConnectionScope("db02").Ado.Connection; Console.WriteLine(gg?.ConnectionString); });
你试试我这个,貌似没问题 我用的sugar.ioc
0 回复 -
badman VIP0
2024/12/27@kldxsg:你这个ioc不是单例吧?如果改成单例注入的话你再试试AddSingleton
我测试发现不管是不是单例 scope 还是 client Parallel.For 内 getconnection 都不行
0 回复 -
kldxsg VIP0
2024/12/27@badman: 不知道。我用的sugar 提供的ioc https://www.donet5.com/home/Doc?typeId=2247 最下面 你试试看
0 回复 -
fate sta VIP0
2024/12/27@badman:
0 回复 -
fate sta VIP0
2024/12/27如果是new sqlsugarScope(ListCongis) 这种肯定是OK的
如果AddConnetion你那种不在一上下文肯定写法是错的
还有疑问发完整代码 ,没有完整代码不在回复
0 回复 -
badman VIP0
2024/12/27@fate sta:AddConnetion 无法同步到上下文是有意为之还是什么原因?如果不能同步到上下文那这个功能意义不大啊,有很多复杂场景,比如数据etl等动态添加数据库,大量数据跨库同步数据,并不是一开始new 的时候就能确定好多数据库的,或者有什么办法能解决这个上线问同步问题?
0 回复 -
fate sta VIP0
2024/12/27@badman:AddConnetion 是针对当前上下文使用的 ,保证多个线程相互不会影响
0 回复 -
fate sta VIP0
2024/12/27你跨上下文了当然不能用,循环内部开了线程等于每个循环是新的请求
0 回复 -
fate sta VIP0
2024/12/27AddConnetion 正确用法就是我那 张截图 结合isanyconnectiong 一起使用
0 回复