我们有许多使用Oracle Data Provider for .NET的.NET应用程序。这通常可以正常工作,但偶尔我们会从一个特定应用程序(有时是其他但非常罕见)中获得一系列错误,其中声称Oracle数据访问客户端出现问题。错误有时略有不同,但都与用户定义的类型有关。失败的一个例子是;
内部例外:
消息:对象引用未设置为对象的实例。
来源:Oracle.DataAccess
堆栈跟踪:
at Oracle.DataAccess.Types.OracleUdtDescriptor.get_UdtTypeName()
at Oracle.DataAccess.Client.OracleDataReader.RetrieveSchemaTable(DataTable& dataTable,Boolean isFromEx)
at Oracle.DataAccess.Client.OracleDataReader.GetSchemaTableCopy(DataTable& dataTable,Boolean isFromEx)
at Oracle.DataAccess.Client.OracleDataReader.GetSchemaTable()
导致这种情况的SQL是;
SELECT a.SECTION_NO,
INITCAP(a.SECTION_NAME) AS SECTION_NAME,
a.SITE_USRN,
a.NETWORK_HIERARCHY,
a.ROAD_CLASS,
a.CENTRAL_ASSET_ID,
a.GEOM,
SDO_NN_DISTANCE(1) AS dist
FROM SCHEMANAME.TABLE_NAME a
WHERE SDO_NN(a.GEOM,
sdo_geometry(2001, 27700, sdo_point_type(366646,101677,NULL), NULL, NULL), 'sdo_num_res=1',1)
= 'TRUE'
当发生这种情况时没有任何模式,95%的时间这些请求都没有问题,但至少每天一次会发生这种情况。它会持续1或2分钟(所以我会得到10-20个错误警告,所有人都说同样的事情),然后它会自行解决,它会再次没问题。我真的不明白问题是什么。我对用户定义的类型知之甚少,并且搜索特定的错误导致很少的相关结果。
我们有时会得到类似错误消息的另一个例子;
内部例外:
消息:对象引用未设置为实例 一个东西。
来源:Oracle.DataAccess
堆栈跟踪:
at Oracle.DataAccess.Types.OracleUdtDescriptor.GetMetaDataTable()
at Oracle.DataAccess.Client.OracleDataReader.GetCachedOracleUdtDescriptor(Int32) 指数)
at Oracle.DataAccess.Client.OracleDataReader.RetrieveSchemaTable(DataTable& dataTable,Boolean isFromEx)
at Oracle.DataAccess.Client.OracleDataReader.GetSchemaTableCopy(DataTable& dataTable,Boolean isFromEx)
at Oracle.DataAccess.Client.OracleDataReader.GetSchemaTable()
正如你所看到的,它们是相似的,但不完全相同,这使得追踪它更加困难。我能想到的唯一可能性是它与撤回GEOM列有关,但我们在很多地方都这样做,并没有得到这个错误,或者可能与撤回SDO_NN号码有关,但是,我们再次在多个地方做到这一点,没有错误。
据我所知,除了GEOM之外,没有返回特殊或异国情况的列类型,考虑到我们使用的是Oracle Spatial,这应该不是问题。
我尝试过的一个修复是在我的Web.config中添加一个名为StatementCacheWithUdts
的设置。
<oracle.dataaccess.client>
<settings>
<add name="StatementCacheWithUdts" value="0"/>
</settings>
</oracle.dataaccess.client>
这是基于我在某个地方发现的类似问题(找不到链接,愚蠢地忘了把它写下来),但这并没有解决问题。
有没有人对我能尝试什么有任何指示?
更多详情
Oracle版本:Oracle数据库11g企业版11.2.0.4.0版 - 64位生产
ODP.Net版本: 4.121.2.0 ODAC RELEASE 3