GetConnectionScope 不是线程安全的 返回

SqlSugar 沟通中
21 420


以下代码会出现异常:提示  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 badman VIP0
    2024/12/27

    刚刚测试了一下, scope.CopyNew() 会获取一个  client,这个client 在  Parallel.ForEach 内部执行  GetConnection("data")  、GetConnectionScope("data") 也都会报错 “SqlSugar.SqlSugarException:“ConfigId was not found data””,,

    0 回复
  • kldxsg kldxsg VIP0
    2024/12/27

    我也发现了,用的是  sugar.ioc

    0 回复
  • badman badman VIP0
    2024/12/27

    @kldxsg 感觉 sugarsql 需要重构了,虽然很多方法是public,比较灵活,但是 灵活的有点过头了,scope CopyNew() 就不应该存在,既然是单例,就不应该CopyNew,如果非要CopyNew 也应该new 出来 Scope 而不是 client,  现在比较混乱,scope  和 client 很多方法交织在一起,特别是  connection   provider 这些,试错学习成本有点太高了

    0 回复
  • kldxsg kldxsg VIP0
    2024/12/27

    不对啊,我是写错没找到,不知道你那里啥错误

    0 回复
  • badman badman VIP0
    2024/12/27

    @kldxsg:Parallel.ForEach   你可以测试一下在 这个多线程里  执行 getconnection 试试,百分百会报错提示找不到

    0 回复
  • fate sta fate sta VIP0
    2024/12/27

    image.png

    0 回复
  • fate sta fate sta VIP0
    2024/12/27

    如果用了addConnection一定要在同一个上下文才能GetConnection

    0 回复
  • fate sta fate sta VIP0
    2024/12/27

    第二 并发函数里要加CopyNew

      var baseinfo = DbScope.CopyNew().GetConnection("data") //CopyNew出来不能用Scope

    0 回复
  • fate sta fate sta VIP0
    2024/12/27

    如果还有疑问提供完整DEMO

    0 回复
  • fate sta fate sta VIP0
    2024/12/27

    image.png

    0 回复
  • badman badman VIP0
    2024/12/27

    @fate sta

    image.png


    你看看这个demo行不行? 多线程环境内无法正常获取 GetConnectionScope  

    0 回复
  • badman badman VIP0
    2024/12/27

    @fate sta:多数据库,Task.When  Paral.For   等  执行 db.CopyNew() 的前提是需要先 getConnection 后在 copynew,现在这个 getconnection 直接就报错了,  

    0 回复
  • kldxsg 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 badman VIP0
    2024/12/27

    @kldxsg:你这个ioc不是单例吧?如果改成单例注入的话你再试试AddSingleton

    我测试发现不管是不是单例  scope 还是 client     Parallel.For 内 getconnection 都不行

    0 回复
  • kldxsg kldxsg VIP0
    2024/12/27

    @badman: 不知道。我用的sugar 提供的ioc   https://www.donet5.com/home/Doc?typeId=2247  最下面 你试试看

    0 回复
  • fate sta fate sta VIP0
    2024/12/27

    @badmanimage.png

    0 回复
  • fate sta fate sta VIP0
    2024/12/27


    如果是new sqlsugarScope(ListCongis)  这种肯定是OK的

    如果AddConnetion你那种不在一上下文肯定写法是错的

    还有疑问发完整代码 ,没有完整代码不在回复

    0 回复
  • badman badman VIP0
    2024/12/27

    @fate staAddConnetion 无法同步到上下文是有意为之还是什么原因?如果不能同步到上下文那这个功能意义不大啊,有很多复杂场景,比如数据etl等动态添加数据库,大量数据跨库同步数据,并不是一开始new 的时候就能确定好多数据库的,或者有什么办法能解决这个上线问同步问题?

    0 回复
  • fate sta fate sta VIP0
    2024/12/27

    @badmanAddConnetion 是针对当前上下文使用的  ,保证多个线程相互不会影响

    0 回复
  • fate sta fate sta VIP0
    2024/12/27

    你跨上下文了当然不能用,循环内部开了线程等于每个循环是新的请求

    0 回复
  • fate sta fate sta VIP0
    2024/12/27

    AddConnetion  正确用法就是我那 张截图 结合isanyconnectiong 一起使用

    0 回复