我们在ASP.NET网站上使用ODP.NET。
环境: Windows Server 2008R2 上的ODP.NET Oracle.DataAccess, Version=4.112.2.0
。 IIS 7.5
问题:
ODP.NET Oracle连接有时会因ORA-03113错误而终止。事件顺序为:
建立Oracle连接并打开连接
执行procudure / function / SQL语句(如g.e。:OracleCommand.ExecuteNonQuery
)时出现连接,并引发ORA-03113错误
ORA-03113:通信频道上的文件结束。进程ID:1660会话ID:266序列号:61873
ExceptionType:Oracle.DataAccess.Client.OracleException,Oracle.DataAccess,Version = 4.112.2.0,Culture = neutral,PublicKeyToken = 89b483f429c47342
我在博客,网站和论坛中阅读禁用连接池将解决此问题。我不知道,因为我还没有尝试过。如果这是解决方法,并且工作;但是,我不想这样做,因为这会降低性能。
at 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命令)
在Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery(DbCommand命令)
在COMPANY.Frk.Data.OracleClient.Command.DoExecuteNonQuery()
在COMPANY.Frk.Data.OracleClient.Command.ExecuteNonQuery()
在COMPANY.Frk.Data.OracleClient.Command.ExecuteStoredFunction()
在COMPANY.B2b.Services.GD.DAL.Login.CheckUser(Int32 companyid,String login,String pass)
在任何Oracle文档中:
ORA-03113:通信频道上的文件结束 原因:客户端和服务器进程之间的连接已断开。如果外部代理程序extproc由于某种原因崩溃,也可能发生这种情况。
操作:存在通信错误,需要进一步调查。首先,检查网络问题并查看SQL * Net设置。另外,请查看alert.log文件中的任何错误。最后,测试以查看服务器进程是否已停止以及是否在失败时生成了跟踪文件。 .NET函数中可能有一些系统调用可能会终止进程。删除此类电话。
有关它的任何建议和疑难解答吗?
更新
我认为,IT部门修改了连接字符串中的Max Pool Size=300;Connection Timeout=30
属性。
疑难解答使用ODP.NET配置 - 跟踪和性能计数器。
1.WCF跟踪(如果您有WCF服务)
<system.diagnostics>
2.ODP.NET性能计数器
OraProvCfg
3.ODP.NET跟踪(注册表或XML)(在Oracle文档中,也就是说使用C#代码,不是吗?)
一个。 TraceLevel(字符串)
湾TraceFileName(字符串) - 路径和您希望跟踪转储的文件名
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:性能计数器。启用/配置perfmon计数器
这是在每个应用程序(或每个主目录,每台计算机等)的基础上完成的。我见过的最好的文章是:http://blog.ilab8.com/2011/09/02/odp-net-pooling-and-connection-request-timed-out
它们会特别有用:
NumberOfActiveConnectionPools
NumberOfActiveConnections
NumberOfFreeConnections
NumberOfInactiveConnectionPools
NumberOfNonPooledConnections
NumberOfPooledConnections
NumberOfReclaimedConnections
NumberOfStasisConnections&#34;另请注意,如果要跟踪完全托管的ODP.NET,则需要 将设置放在应用程序或Web配置文件中,而不是 注册表,和TraceLevel的设置是不同的(1到7)。 最后,当跟踪非托管ODP.NET时,请记住有一个 为32位Windows分离WOW注册表节点。如果您的应用是32位, 不要在注册表的64位部分意外设置它。&#34;
OracleConnection类 - 支持的连接字符串属性 https://docs.oracle.com/html/B10961_01/client4.htm#1000348
ODP.NET Connection Pooling Parameters
&#34; IIS中的应用程序池配置为&#34;最大数量 工人流程&#34;设置不同于默认值1.我有什么 发现数据库中看到的连接数可以增长 最大池大小*工作进程数。
因此,如果我的最大池大小为5和5工作进程,那么总数 允许的连接数是25.所以似乎每个工人 进程拥有自己不共享的连接池实例 跨越其他工作流程。
请注意,连接池是每个应用程序域的每个工作进程, 所以,最大池大小为5 * 5工人进程* 2域每个= 50 连接&#34;
参考:
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
Oracle Data Provider for .NET最佳实践 https://nvtechnotes.wordpress.com/2009/04/13/oracle-data-provider-for-net-best-practices/
2.启用/配置perfmon计数器这是在每个应用程序(或每个主目录,每台计算机等)的基础上完成的。我见过的最好的文章是: http://blog.ilab8.com/2011/09/02/odp-net-pooling-and-connection-request-timed-out
请特别注意32位应用程序的特定步骤,以及安装/配置/启动操作顺序。
1.安装perfmon计数器如果尚未安装,请按照此处的说明操作: http://blog.bekijkhet.com/2010/01/odpnet-performance-counters-do-not-show.html
Enable ODP.Net logging 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
验证Connection = true
使用Validate Connection,在Open()中验证实际连接 方法
然而,设置标志会导致性能下降 到文档:http://docs.oracle.com/html/E10927_01/featConnecting.htm 只有在绝对必要时才应使用此属性,因为 它导致数据库的往返以验证每个连接 在它提供给申请之前。