SqlSugar.SqlSugarException: 中文提示 : 连接数据库过程中发生错误,检查服务器是否正常连接 返回

SqlSugar 沟通中
9 246
该叫什么 exile 发布于1周前
悬赏:0 飞吻

  

部署的接口在后端高频连续访问时会偶尔出现这个错误提示,持续半个小时左右恢复?数据库连接字符串配置连接池数。

 SqlSugar.SqlSugarException: 中文提示 :  连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:池式连接请求超时DbType="Oracle";ConfigId="".

English Message : Connection open error . 池式连接请求超时DbType="Oracle";ConfigId=""

   at SqlSugar.Check.Exception(Boolean isException, String message, String[] args)

   at SqlSugar.AdoProvider.CheckConnection()

   at SqlSugar.OracleProvider.GetCommand(String sql, SugarParameter[] parameters)

   at SqlSugar.AdoProvider.GetDataSetAll(String sql, SugarParameter[] parameters)

   at SqlSugar.AdoProvider.GetDataTable(String sql, SugarParameter[] parameters)

   at SqlSugar.AdoProvider.GetDataTable(String sql, List`1 parameters)


热忱回答9

  • exile exile VIP0
    1周前

    image.png连续请求的过程中IP 26的接口出现如下报错

    0 回复
  • exile exile VIP0
    1周前

    1715774797715.jpg期间请求到26 IP的接口后一直报错,直到30分钟后,不出现错误。

    0 回复
  • exile exile VIP0
    1周前

    db = SqlsugarHelper.Instance;

    var rst = db.Ado.GetDataTable(sqlQuery.ToString(), paramList);

    执行如下GetDataTable查询时抛出异常。

    0 回复
  • exile exile VIP0
    1周前

    User Id=XXX;Password=XXX;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=XX.X.X.XX)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=XXX))) 数据库连接字符串设置如下,未设置线程池数量配置。这个错误是否跟站点连续导致$Session连接持续创建线程池数量超出,之后恢复是因为线程池被自动回收后恢复?

    0 回复
  • exile exile VIP0
    1周前

            public static SqlSugarClient Instance

            {

                get

                {

                    if (!string.IsNullOrWhiteSpace(ConnectionString))

                    {

                        SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()

                        {

                            ConnectionString = ConnectionString,

                            DbType = dbtype,//设置数据库类型

                            IsAutoCloseConnection = true,//自动释放数据务,如果存在事务,在事务结束后释放

                            InitKeyType = InitKeyType.SystemTable,//从数据库系统表读取主键信息中(InitKeyType.Attribute从实体特性中读取主键自增列信息)

                        });


                        //  调试SQL,AOP ,日志

                        db.Aop.OnLogExecuted = (sql, pars) => //SQL执行完事件

                        {

    #if DEBUG

                            //获取执行后的总毫秒数

                            double sqlExecutionTotalMilliseconds = db.Ado.SqlExecutionTime.TotalMilliseconds;

    #endif

                        };

                        db.Aop.OnLogExecuting = (sql, pars) => //SQL执行前事件。可在这里查看生成的sql

                        {

    #if DEBUG

                            string tempSQL = LookSQL(sql, pars);

    #endif

                        };

                        db.Aop.OnError = (exp) =>//执行SQL 错误事件

                        {

                            //exp.sql exp.parameters 可以拿到参数和错误Sql  

                            StringBuilder sb_SugarParameterStr = new StringBuilder("###SugarParameter参数为:");

                            var parametres = exp.Parametres as SugarParameter[];

                            if (parametres != null)

                            {

                                sb_SugarParameterStr.Append(JsonConvert.SerializeObject(parametres));

                            }


                            StringBuilder sb_error = new StringBuilder();

                            sb_error.AppendLine("SqlSugarClient执行sql异常信息:" + exp.Message);

                            sb_error.AppendLine("###赋值后sql:" + LookSQL(exp.Sql, parametres));

                            sb_error.AppendLine("###带参数的sql:" + exp.Sql);

                            sb_error.AppendLine("###参数信息:" + sb_SugarParameterStr.ToString());

                            sb_error.AppendLine("###StackTrace信息:" + exp.StackTrace);



                        };


                        db.Aop.OnExecutingChangeSql = (sql, pars) => //SQL执行前 可以修改SQL

                        {

                            //判断update或delete方法是否有where条件。如果真的想删除所有数据,请where(p=>true)或where(p=>p.id>0)

                            if (sql.TrimStart().IndexOf("delete ", StringComparison.CurrentCultureIgnoreCase) == 0)

                            {

                                if (sql.IndexOf("where", StringComparison.CurrentCultureIgnoreCase) <= 0)

                                {

                                    throw new Exception("delete删除方法需要有where条件!!");

                                }

                            }

                            else if (sql.TrimStart().IndexOf("update ", StringComparison.CurrentCultureIgnoreCase) == 0)

                            {

                                if (sql.IndexOf("where", StringComparison.CurrentCultureIgnoreCase) <= 0)

                                {

                                    throw new Exception("update更新方法需要有where条件!!");

                                }

                            }


                            return new KeyValuePair<string, SugarParameter[]>(sql, pars);

                        };

                        return db;

                    }

                    else

                    {

                        return null;

                    }


                }

            }


    0 回复
  • exile exile VIP0
    1周前

            public DataTable xxx(string xxx, List<string> xxx)

            {

                List<SugarParameter> paramList = new List<SugarParameter>();

                StringBuilder sqlQuery = new StringBuilder($@"");

                paramList.Add(new SugarParameter("@xxx", xxx));

                paramList.Add(new SugarParameter("@xxx", xxx));

                var rst = db.Ado.GetDataTable(sqlQuery.ToString(), paramList);

                return rst;

            }


    0 回复
  • exile exile VIP0
    1周前

    底层的连接应该是这个报错 

      Oracle.ManagedDataAccess.Client.OracleException (0x80004005): 池式连接请求超时

       at OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, OracleConnection connRefForCriteria, String affinityInstanceName, Boolean bForceMatch)

       at OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, OracleConnection connRefForCriteria, String affinityInstanceName, Boolean bForceMatch)

       at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword, OracleConnection connRefForCriteria)

       at Oracle.ManagedDataAccess.Client.OracleConnection.Open()


    0 回复
  • 如果连接池数量 异常 那大概率是线程安全问题 

    文档:https://www.donet5.com/Home/Doc?typeId=1224

    如果并发很高max pool size设置为1000 


    0 回复
  • exile exile VIP0
    1周前

    @fate sta:好的 感谢大佬,我先试用这种方法var rst = db.CopyNew().Ado.GetDataTable(sqlQuery.ToString(), paramList);测试一下;然后将数据库连接字符串中的Max Pool Size=1000;那对于Min Pool Size以及Connection Timeout需要修改不?

    0 回复