最新版连接oracle出现错误 返回

SqlSugar 沟通中
10 546
该叫什么 冬天 发布于2025/8/21
悬赏:0 飞吻

使用最新版SqlSugarCore5.1.4.199,使用定时任务Quartz每30分钟执行下面的方法,刚启动可以正常执行,30分钟后的所有定时任务都报错,Oracle19C,麻烦大佬抽空看下,去掉copynew也是一样,去掉using也是,各种方法都尝试了,谢谢!

image.png



ORA-12570: TNS:packet reader failure
https://docs.oracle.com/error-help/db/ora-12570/ | 堆栈:   at Oracle.ManagedDataAccess.Client.OracleException.HandleError(OracleTraceLevel level, OracleTraceTag tag, OracleTraceClassName className, OracleTraceFuncName funcName, Object traceObj, Exception ex, OracleLogicalTransaction oracleLogicalTransaction)
   at OracleInternal.TTC.TTCExecuteSql.ReceiveExecuteResponseAsync(Accessor[] bindAccessors, Boolean bHasReturningParams, SqlStatementType statementType, Int64 noOfRowsFetchedLastTime, Int64 noOfRowsToFetch, Int32 longFetchSize, Int64 clientInitialLOBFetchSize, Int64 initialLOBFetchSize, Int64 initialJSONFetchSize, Int64[] scnFromExecution, Boolean bAllInputBinds, Int32 arrayBindCount, Boolean bDefineDone, RER_RefAndOutParamArgCtx refOutArgCtx, Boolean bReadSqlId, Boolean bLOBArrayFetchRequired, Boolean bAsync)
   at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteReaderAsync(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[] scnForExecution, Int64 internalInitialJSONFS, OracleConnection connection, ER_RefAndOutParamArgCtx er_refOutCtx, Boolean isDescribeOnly, Boolean isFromEF, Boolean bAsync)
   at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteReaderInternalAsync(Boolean requery, Boolean fillRequest, CommandBehavior behavior, Boolean bAsync, CancellationToken cancellationToken)
   at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteScalarInternalAsync(Boolean bAsync, CancellationToken cancellationToken)
   at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteScalarAsyncHelper(CancellationToken cancellationToken)
   at SqlSugar.AdoProvider.GetScalarAsync(String sql, SugarParameter[] parameters)
   at SqlSugar.AdoProvider.GetIntAsync(String sql, SugarParameter[] parameters)
   at

热忱回答10

  • fate sta fate sta VIP0
    2025/8/21

    image.png

    0 回复
  • fate sta fate sta VIP0
    2025/8/21

    和using没有关系。看文档:遇发

    如果对异步使用不熟悉你还是用老版本吧

    0 回复
  • fate sta fate sta VIP0
    2025/8/21

    或者还有疑问提供完整的DEMO。

    0 回复
  • fate sta fate sta VIP0
    2025/8/21

    如果定时任务只有这一个方法是没有问题,目前代码OK

    image.png

    0 回复
  • fate sta fate sta VIP0
    2025/8/21

    检查AOP中有没有异步方法,可能问题出在AOP中。 表达式Action类型是不受等待效果的

    0 回复
  • 冬天 冬天 VIP0
    2025/8/22

    @fate sta:Aop中只有输出sql语句,没有执行方法

    0 回复
  • fate sta fate sta VIP0
    2025/8/22

    还有疑问可以自个写个DEMO测试,能重现发我

    0 回复
  • fate sta fate sta VIP0
    2025/8/22

    当然也可能是驱动版不一样引起的其他因素。你可以写DEMO验证。能重现在发我

    0 回复
  • 冬天 冬天 VIP0
    2025/8/22

    @fate sta:使用sqlsugar自带的Oracle.ManagedDataAccess.Core23.8版本,用原生方法写就正常

    private static async Task<int> GetCountByDateRangeAsync(DateTime start, DateTime end)

    {

        var sql = @"SELECT COUNT(*) FROM " + TableName +

            @" WHERE TO_DATE(RQ, 'YYYY-MM-DD') BETWEEN TO_DATE(:startDate, 'YYYY-MM-DD') AND TO_DATE(:endDate, 'YYYY-MM-DD')";

        var param = new

        {

            startDate = start.ToString("yyyy-MM-dd"),

            endDate = end.ToString("yyyy-MM-dd")

        };


        try

        {

            NativeOracleHelper nativeOracleHelper = new();


            object result = await nativeOracleHelper.GetScalarAsync(

                sqlCommand: sql,

                parameters: param,

                commandTimeout: 180); // 覆盖默认超时时间


            //Oracle的COUNT(*)返回类型为NUMBER,在.NET中默认映射为decimal类型。直接强制转换为int会触发InvalidCastException。

            decimal decimalCount = Convert.ToDecimal(result);


            if (decimalCount > int.MaxValue)

            {

                throw new OverflowException("数值超出int范围");

            }

            return (int)decimalCount;

        }

        catch (OracleException ex)

        {

            // 处理连接错误

            throw Oops.Oh($"{ex.Message} | 堆栈:{ex.StackTrace} | 异常:{ex.InnerException}", ex);

        }

    }



    0 回复
  • 冬天 冬天 VIP0
    2025/8/22

    public async Task<object> GetScalarAsync(

        string sqlCommand, 

        object parameters = null,

        int commandTimeout = 60,

        CancellationToken cancellationToken = default)

    {

        using (var connection = new OracleConnection(_connectionString))

        {

            // 创建双重超时控制机制:

            // 1. 内部默认30秒全局超时

            // 2. 合并外部传入的取消令牌

            using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));

            using var linkedToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, cts.Token);


            await connection.OpenAsync(linkedToken.Token);


            using var command = CreateCommand(connection, sqlCommand, parameters);

            command.CommandTimeout = commandTimeout;


            object scalar = await command.ExecuteScalarAsync(linkedToken.Token);


            return scalar;

        }

    }


    0 回复