Oracle DataAccess OracleUDTDescriptor随机失败

时间:2017-03-09 11:29:33

标签: oracle oracle11g odp.net user-defined-types oracle-spatial

我们有许多使用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

0 个答案:

没有答案