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

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 VIP0
2025/8/21
0 回复 -
fate sta VIP0
2025/8/21和using没有关系。看文档:遇发
如果对异步使用不熟悉你还是用老版本吧
0 回复 -
fate sta VIP0
2025/8/21或者还有疑问提供完整的DEMO。
0 回复 -
fate sta VIP0
2025/8/21如果定时任务只有这一个方法是没有问题,目前代码OK
0 回复 -
fate sta VIP0
2025/8/21检查AOP中有没有异步方法,可能问题出在AOP中。 表达式Action类型是不受等待效果的
0 回复 -
冬天 VIP0
2025/8/22@fate sta:Aop中只有输出sql语句,没有执行方法
0 回复 -
fate sta VIP0
2025/8/22还有疑问可以自个写个DEMO测试,能重现发我
0 回复 -
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/22public 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 回复