c# - 从 Oracle 托管数据访问 c# 中间歇性 Oracle 连接请求超时
问题描述
我正在使用 Oracle.ManagedDataAccess (v4.122.19.1) 从 asp.net MVC (.NetFramework v4.6.1) Web 应用程序连接到我的 Oracle 数据库。
自过去 4 天以来一直运行良好。突然,有一天 Oracle ManagedDataAcess 连续抛出连接超时错误(这会减慢整个系统的速度),但一两分钟后,一切都恢复正常,系统运行平稳。下面给出了发生连接超时错误时的消息和堆栈跟踪。
Message: Connection request timed out
Error code : -2147467259
Number : -1000
HResult : -2147467259
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()
at Repository.DBProvider.GetConnection(Boolean openConnection) in ***\Repository\DBProvider.cs:line 21
Oracle Data Provider for .NET, Managed Driver
我尝试了以下修复
- 在服务器防火墙中增加 KeepAlive 以检查是否是 Web 服务器超时问题,没有工作
- 在本地创建了一个示例应用程序并直接连接到数据库,它工作正常,同时 Web 应用程序失败
- 此外,我确实有另一个 Web 应用程序(托管在另一台服务器中),但使用旧的连接方法(ODP.NET 使用 oracle 客户端 tnsparams.ora)。这个不会抛出任何连接超时异常。
- 给定“池=true;最小池大小=10;连接超时=20;最大池大小=50;” 在 web.config 中(虽然没有工作)
- 使用以下更新 web.config 文件
<oracle.manageddataaccess.client> <version number="*"> <settings> <setting name="SQLNET.AUTHENTICATION_SERVICES" value="null" /> </settings> </version> </oracle.manageddataaccess.client>
但得到另一个错误如下
ORA-12649: Native Services: Unknown encrpytion or data integrity algorithm
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()
at Repository.DBProvider.GetConnection(Boolean openConnection) in ***\Repository\DBProvider.cs:line 22
Oracle Data Provider for .NET, Managed Driver
我找到了一些其他类似的解决方案,但没有锻炼。
注意:我的 Web 应用程序池运行 32 位模式。
任何帮助,将不胜感激。
解决方案
推荐阅读
- c# - C# - 如何在 AppData 目录中安装数据库?
- mysql - 在结果集中使用条件连接查找两个表的所有数据
- spring-boot - 条件属性spring boot上的consul配置
- matlab - 如果点数 N 不是 2 的幂,FFT 如何工作?
- linux - musl 库 malloc() 实现如何决定 bin 索引?
- jquery - jquery - 将 div 文本转换为输入字段
- arrays - 如何仅使用函数在 bash/脚本中将十六进制转换为十进制
- node.js - 如何使用 Express 后端在 React JS 中维护会话和超时重定向?
- objective-c - 枚举器值计算为 -2147483648,不能缩小为类型“NSUInteger”(又名“无符号长”)
- javascript - 有没有办法使用用户创建的扩展在 chrome 浏览器中打开 devtool 面板