问题标签 [ora-03113]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1914 浏览

c# - ORA-03113 用于 ASP.NET 中的 OracleException ODP.NET

我们在 ASP.NET 网站中使用 ODP.NET。

环境: Windows Server 2008R2Oracle.DataAccess, Version=4.112.2.0上的ODP.NET 。IIS 7.5

问题:

ODP.NET Oracle 连接有时会因 ORA-03113 错误而终止。事件顺序是:

  1. Oracle 连接建立并打开连接

  2. 在执行过程/函数/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 服务)

2.ODP.NET 性能计数器

3.ODP.NET 跟踪(注册表或 XML)(在 Oracle 文档中,也使用 C# 代码,不是吗?)

一个。TraceLevel(字符串)
b. TraceFileName (string) - 路径和您希望跟踪转储的文件名
c. TraceOutput (string) – 0 表示单个文件,1 表示多个文件

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

ODP.NET 连接池参数

“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 此属性仅应在绝对必要时使用,因为它会导致往返数据库在将每个连接提供给应用程序之前立即对其进行验证。

0 投票
1 回答
388 浏览

oracle11g - 为什么 oracle 数据库链接不显示来自 sqlserver 的图像类型的列

我们有 2 台服务器:

Windows 2012 上的 1-sqlserver 2012

2-oracle 11g 在 Linux 上

我们想在 oracle 数据库的 sql server 中显示来自 table1 的信息,并在它们之间创建数据库链接

当我有类似的查询时

plsql中的“从TABLE1中选择ID,NAME”

我可以看到真实的结果

但是当我有类似的查询时

plsql中的“从TABLE1中选择ID,NAME,picimage”

我收到这些错误 1 ​​ORA-03113:通信通道 2 上的文件结束 ORA-03114:未连接到 oracle

有谁能够帮助我?

0 投票
0 回答
23 浏览

oracle - 由于短暂的网络中断,可以使用 ODBC 从 ORA-03113 中恢复吗?

我正在通过 ODBC 和 Oracle Instantclient 18c 连接到我们通过 VPN 连接到的另一个位置的 Oracle DB。这是直接在两个位置的防火墙之间建立的 VPN 连接。

每当我们的互联网连接失败时,哪怕只是一秒钟,我们都会收到 ORA-03113。

研究这个错误只会导致我报告由于空闲连接(之前有这个,已经在防火墙中修复这个问题,与这种情况无关)或数据库本身的问题。在我们的例子中,我们只有在互联网出现故障时才会出现这个错误(我们可以在防火墙日志中清楚地看到)。

有什么方法或设置可以从中恢复吗?

在 ODBC 设置中,我确保检查了故障转移设置,但这没有效果:

在此处输入图像描述

我还没有更改本地 sqlnet.ora 中的任何内容。

使用此 ODBC 连接的应用程序是在夜间运行的第三方软件(BI 的 ETL 过程),因此我无法以编程方式将其作为异常捕获并正确处理(例如重新连接或其他类似重新启动整个过程) .

可以对数据库服务器或防火墙进行调整,但并不容易,因此最好使用本地解决方案。