ORA-12571:TNS:使用ASP.NET的数据包写入程序失败

时间:2011-08-22 17:29:37

标签: asp.net oracle11g odp.net system.data.oracleclient

我的开发团队使用ASP.NET 3.5和4.0针对Oracle 11g遇到了大量ORA-12571: TNS:packet writer failure错误。这些错误在它们何时发生时是不一致的,并且由许多应用程序生成。调用随机存储过程,数据包和内联SQL语句时会发生此异常。 Oracle 11客户端安装在Web服务器上。某些应用程序使用Microsoft System.Data.OracleClient连接到Oracle,有些应用程序使用oracle(ODP.NET)提供的.NET组件。两个数据访问对象都会出现相同的错误。

还有其他非.NET应用程序在不同的Web服务器上运行,但使用相同的数据库服务器。这些应用程序没有任何此类问题。我最初的想法是,使用Oracle客户端在Web服务器上配置错误。

有没有其他人收到此错误?你做了什么来解决它?

ORA-12571: TNS:packet writer failure

堆栈追踪:

at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
   at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
   at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, ArrayList& resultParameterOrdinals)
   at System.Data.OracleClient.OracleCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.OracleClient.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable)

3 个答案:

答案 0 :(得分:7)

另一种可能的解决方案是,您和Oracle数据库之间的防火墙认为您的连接已关闭并在您下方关闭它。您只会在尝试执行查询并获取ORA-12571错误时找到它。

这是因为连接打开很长时间而没有活动。

解决方案是将SQLNET.EXPIRE_TIME添加到服务器上的sqlnet.ora文件中,并将其设置为某个时间间隔(10)。这将导致连接每10分钟被ping一次,以确保它们仍然存活。

结果是您的防火墙将看到网络活动,而不是关闭连接。

SQLNET.EXPIRE_TIME=10

ORA-12571: TNS:packet writer failure - One of the hardest problems I've had to resolve

答案 1 :(得分:1)

我认为这是Oracle中的一个错误。我遇到了DBDataAdapter.Fill方法的许多问题,其中Oracle客户端会阻塞内存错误。通过使用应用了补丁6的11.2.0.2客户端,我得到了解决。

如果您搜索Oracle的支持网站,您会看到很多这样的问题。

同时检查11g1 / 11g2客户端的“读取受保护的内存”问题。

答案 2 :(得分:0)

安装elmah模块后可以分析异常,我试着:

  1. 更改连接配置。
  2. 删除和/或更新服务器防火墙规则。
  3. 更新服务器计算机上的Oracle客户端。
  4. 上面的任何选项都解决了这个问题,但我忘记了我们使用的过时的提供程序(System.Data.OracleClient)。在我用最后一个版本的ODP.NET (Oracle.DataAccess)替换它之后,everthing开始完美地工作。

    Obs:根据您的异常描述,您当前正在使用过时的提供程序。