我的开发团队使用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)
答案 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模块后可以分析异常,我试着:
上面的任何选项都解决了这个问题,但我忘记了我们使用的过时的提供程序(System.Data.OracleClient)。在我用最后一个版本的ODP.NET (Oracle.DataAccess)替换它之后,everthing开始完美地工作。
Obs:根据您的异常描述,您当前正在使用过时的提供程序。