我们在 ASP.NET 网站中使用 ODP.NET。
环境: Windows Server 2008R2Oracle.DataAccess, Version=4.112.2.0
上的ODP.NET 。IIS 7.5
问题:
ODP.NET Oracle 连接有时会因 ORA-03113 错误而终止。事件顺序是:
Oracle 连接建立并打开连接
在执行过程/函数/SQL 语句(如 ge:
OracleCommand.ExecuteNonQuery
)时使用连接,并引发 ORA-03113 错误
ORA-03113: 通信通道上的文件结束。进程 ID:1660 会话 ID:266 序列号:61873
异常类型:Oracle.DataAccess.Client.OracleException,Oracle.DataAccess,版本=4.112.2.0,文化=中性,PublicKeyToken=89b483f429c47342
我在博客、网站和论坛中读到禁用连接池可以解决这个问题。我不知道,因为我没有尝试过。如果这是解决方法,并且有效;但是,我不想这样做,因为这会降低性能。
在 Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
在 Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()
在 Microsoft.Practices。 EnterpriseLibrary.Data.Database.DoExecuteNonQuery(DbCommand command)
在 Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery(DbCommand command)
在 COMPANY.Frk.Data.OracleClient.Command.DoExecuteNonQuery()
在 COMPANY.Frk.Data.OracleClient。
COMPANY.Frk.Data.OracleClient.Command.ExecuteStoredFunction()的 COMPANY.B2b.Services.GD.DAL.Login.CheckUser 的Command.ExecuteNonQuery()
(Int32 companyid, String login, String pass)
在任何 Oracle 文档中:
ORA-03113:通信通道上的文件结束原因:客户端和服务器进程之间的连接被破坏。如果外部代理 extproc 由于某种原因崩溃,也可能发生这种情况。
行动:存在需要进一步调查的通信错误。首先,检查网络问题并查看 SQL*Net 设置。此外,查看 alert.log 文件是否有任何错误。最后测试一下服务器进程是否死机,失败时是否生成了trace文件。.NET 函数中可能有一些系统调用可能会终止进程。删除此类电话。
关于它的任何建议和故障排除?
更新:
我认为,IT 部门已经修改Max Pool Size=300;Connection Timeout=30
了连接字符串中的属性。
使用 ODP.NET 配置进行故障排除- 跟踪和性能计数器。
1.WCF Traces(如果你有 WCF 服务)
<system.diagnostics>
2.ODP.NET 性能计数器
OraProvCfg
3.ODP.NET 跟踪(注册表或 XML)(在 Oracle 文档中,也使用 C# 代码,不是吗?)
一个。TraceLevel(字符串)
b. TraceFileName (string) - 路径和您希望跟踪转储的文件名
c. TraceOutput (string) – 0 表示单个文件,1 表示多个文件
XML config: <oracle.dataaccess.client> <settings>
Registry:
HKEY_LOCAL_MACHINE\Software\Oracle\ODP.NET\<version>
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\ODP.NET\<version>
For 64 bit : HKEY_LOCAL_MACHINE\Software\Oracle\ODP.NET\2.111.7.0
For 32 bit : HKEY_LOCAL_MACHINE\Software\WOW6432node\Oracle\ODP.NET\2.111.7.0
My version: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\ODP.NET\4.112.2.0
4:性能计数器。启用/配置性能计数器
这是在每个应用程序(或每个主目录、每台机器等)的基础上完成的。我见过的最好的文章在这里:http ://blog.ilab8.com/2011/09/02/odp-net-pooling-and-connection-request-timed-out
它们将特别有用:
NumberOfActiveConnectionPools
NumberOfActiveConnections
NumberOfFreeConnections
NumberOfInactiveConnectionPools
NumberOfNonPooledConnections
NumberOfPooledConnections
NumberOfReclaimedConnections
NumberOfStasisConnections“还要注意,如果你想跟踪完全托管的 ODP.NET,你需要将设置放在应用程序或 Web 配置文件中,而不是注册表中,并且 TraceLevel 的设置是不同的(1 到 7)。最后,在跟踪非托管 ODP.NET 时,请记住对于 32 位 Windows 有一个单独的 WOW 注册表节点。如果您的应用程序是 32 位的,请不要意外将其设置在注册表的 64 位部分下。
OracleConnection 类 - 支持的连接字符串属性 https://docs.oracle.com/html/B10961_01/client4.htm#1000348
“IIS 中的应用程序池被配置为将“最大工作进程数”设置为不同于默认值 1。我发现在数据库中看到的连接数可以增长到最大池大小 * 数量工作进程。
因此,如果我的最大池大小为 5 和 5 个工作进程,则允许的连接总数为 25。所以似乎每个工作进程都有自己的连接池实例,该实例不与其他工作进程共享。
请注意,连接池是每个应用程序域的每个工作进程,因此,最大池大小为 5 * 5 个工作进程 * 每个 2 个域 = 50 个连接"
参考资料:
11g 第 1 版 (11.1.0.6.20) http://docs.oracle.com/html/E10927_01/featConfig.htm
11g 第 2 版 (11.2) http://docs.oracle.com/cd/E11882_01/win.112/e23174/featConfig.htm#ODPNT155
http://webiv.oraclecorp.com/cgi-bin/webiv/do.pl/Get?WwwID=note:730678.1#Connections not found
适用于 .NET 最佳实践的 Oracle 数据提供程序 https://nvtechnotes.wordpress.com/2009/04/13/oracle-data-provider-for-net-best-practices/
2.启用/配置性能计数器这是在每个应用程序(或每个主目录,每台机器等)的基础上完成的。我见过的最好的文章在这里: http ://blog.ilab8.com/2011/09/02/odp-net-pooling-and-connection-request-timed-out
请特别注意 32 位应用程序的具体步骤,以及安装/配置/启动操作的顺序。
1.安装性能计数器如果尚未安装,请按照此处的说明进行操作:http: //blog.bekijkhet.com/2010/01/odpnet-performance-counters-do-not-show.html
启用 ODP.Net 日志记录 http://blogs.msdn.com/b/biztalknotes/archive/2013/03/14/collecting-troubleshooting-data-for-wcf-oracle-adapter.aspx
https://collecteddotnet.wordpress.com/2009/05/29/understanding-connection-pooling/ http://www.codeguru.com/csharp/.net/net_asp/article.php/c19395/Tuning-Up-ADONET -Connection-Pooling-in-ASPNET-Applications.htm http://oradim.blogspot.com.es/2008/02/experimenting-with-connection-pooling.html
验证连接=true
使用验证连接,真正的连接在 Open() 方法中得到验证。
但是,根据文档,设置标志会导致性能损失:http: //docs.oracle.com/html/E10927_01/featConnecting.htm 此属性仅应在绝对必要时使用,因为它会导致往返数据库在将每个连接提供给应用程序之前立即对其进行验证。