DotNetNext / SqlSugar

.Net aot ORM Fastest ORM Simple Easy VB.NET Sqlite orm Oracle ORM Mysql Orm 虚谷数据库 postgresql ORm SqlServer oRm 达梦 ORM 人大金仓 ORM 神通ORM C# ORM , C# ORM .NET ORM NET5 ORM .NET6 ORM ClickHouse orm QuestDb ,TDengine ORM,OceanBase orm,GaussDB orm ,Tidb orm Object/Relational Mapping
https://www.donet5.com/Home/Doc
MIT License
5.35k stars 1.34k forks source link

SQLServer数据库,读写分离 同一查询操作,第二次查询操作 数据库连接失败 #977

Closed sunyu05 closed 2 years ago

sunyu05 commented 2 years ago

Nuget版本: SqlSugarCore Ver 5.0.4.3

SqlSugar注册代码: services.TryAddSingleton(o => { dbSettings.MainDbs.ForEach(m => { // 从数据库配置 var slaveConfigs = new List();

                m.SlaveDbs.ForEach(s =>
                {
                    slaveConfigs.Add(new SlaveConnectionConfig()
                    {
                        HitRate = s.HitRate,
                        ConnectionString = s.ConnectionString
                    });
                });

                mainConfigs.Add(new ConnectionConfig()
                {
                    ConfigId = m.ConfigId,
                    ConnectionString = m.ConnectionString,
                    DbType = (DbType)m.DatabaseType,
                    InitKeyType = InitKeyType.Attribute,// 从特性读取主键和自增列信息
                    IsAutoCloseConnection = true,// 开启自动释放模式和EF原理一样我就不多解释了
                    AopEvents = new AopEvents
                    {
                        OnError = (s) =>
                        {
                            logger.LogError(s.Message);
                        },
                        OnLogExecuted = (sql, p) =>
                        {
                            if (m.LogEnabled)
                            {
                                Parallel.For(0, 1, e =>
                                {
                                    logger.LogInformation("【SQL】:" + sql);
                                    logger.LogInformation(GetParas(p));
                                });
                            }
                        }
                    },
                    MoreSettings = new ConnMoreSettings()
                    {
                        IsAutoRemoveDataCache = true,
                        PgSqlIsAutoToLower = m.PgSqlIsAutoToLower, //PostgreSQL表名、字段名是否自动转小写
                        DisableNvarchar = true //MySql禁用Nvarchar
                    },
                    SlaveConnectionConfigs = slaveConfigs
                });
            });
            return new SqlSugarScope(mainConfigs);
        });

        services.TryAddScoped(typeof(IDbContext), typeof(SqlSugarContext));
        services.TryAddScoped(typeof(IUnitOfWork), typeof(SqlSugarUnitOfWork));

异常: SqlSugar.SqlSugarException HResult=0x80131500 Message=中文提示 : 连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,实在找不到原因请先Google错误信息:ユーザー 'sa' はログインできませんでした。.

DotNetNext commented 2 years ago

升级到最新这个应该修复过了 ,并且

sunyu05 commented 2 years ago

刚更新到最新版本试了一下,还会偶发性的出现这个异常 2021-12-07_172632

Inked20211209_LI

DotNetNext commented 2 years ago

new SqlSugarScope(new {})

mainConfigs 这种全局变量全部去掉 SqlSugarScope(对象)里面的对象全部是新NEW出来的

DotNetNext commented 2 years ago

还有问题?

sunyu05 commented 2 years ago

按照你的建议把注册的代码改了一下

1.不加从库配置,可以正常读写。只要加上从库配置进行读写操作就会抛出异常。

2.在读写操作前使用SqlSugarScope.BeginTran()开事务,可以正常读写。不手动开事务的情况也会抛出这个异常。

我现在还在调查是不是工程中对Repository的生命周期管理导致的出现这个问题。

DotNetNext commented 2 years ago

https://www.donet5.com/Home/Doc?typeId=2366 你可以按这个例子写个模版测试一下

DotNetNext commented 2 years ago

有问题直接发我

sunyu05 commented 2 years ago

在没有使用事务的场景,相同的DAO做查询和更新操作。

执行顺序(Api内调用): 1.更新操作 2.查询操作

结果是: 第一遍更新和查询操作都是可以正常执行的; 第二遍在更新操作的时间点抛出异常(中文提示 : 连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,实在找不到原因请先Google错误信息:ユーザー 'sa' はログインできませんでした。English Message : Connection open error . ユーザー 'sa' はログインできませんでした。)

DotNetNext commented 2 years ago

5.0.4.7发布了

sunyu05 commented 2 years ago

问题解决了,辛苦了,非常感谢!