日常工作: 应用服务器Oracle驱动问题说明

时间:2022-09-13 22:18:43

1. .net使用Oracle驱动的发展等

作为.net线的产品的ERP产品 最初的版本 使用了.net 1.1发布时 微软提供的Oracle的驱动

但是后续微软的.net产品线貌似没有继续发展相应的驱动. Oracle自己发布了ODP.net的驱动版本.

因为一些历史原因, 产品一直跑在微软的驱动上面,但是毕竟已经是十几年前的驱动, 性能不佳以及各种bug较多, 已经越来越无法满足产品的需求.

所以在2016年公司决定使用新的Oracle 的ODP.net的驱动 进行适配.

关于微软驱动的简介图:

日常工作: 应用服务器Oracle驱动问题说明

转一个公众号发的.net的技术线:

日常工作: 应用服务器Oracle驱动问题说明

关于.net版本的说明:

(.NET Framework 2.0/3.x和.NET Framework 4.x分别采用CLR 2.0和CLR 4.0),下图很直观地说明了这个问题。

日常工作: 应用服务器Oracle驱动问题说明

摘自:http://www.cnblogs.com/artech/p/how-to-cross-platform-01.html

2. ODP.net驱动的支持以及版本特点

理论上升级到GS7.0的版本都支持Oracle的ODP.net的驱动

关于ODP.NET 驱动 记得应该是2007年发布的oracle10gr1 的版本最初开始支持的 当时因为Oracle的.net4.0还没发布 所以最初发版的ODP.NET只有2.x的版本

等着Oracle10gr2 以后的版本都会同时发布2.x和 4.x两个版本的ODP.NET驱动(这个应该是针对CLR版本 不是针对具体的.net版本)

如下是默认安装的Oracle11g客户端带的ODP.NET驱动

日常工作: 应用服务器Oracle驱动问题说明

核心dll以及版本:

版本备注 4 意味着是For .net4.0 的 112 是11gr2的版本发布

最后一个0 意味着是 Oracle 11gr2发布时的版本 未更新 驱动相关的补丁包:

4.112.0

日常工作: 应用服务器Oracle驱动问题说明

3. 如何验证是微软驱动还是Oracle ODP.net驱动

GS产品的驱动开发延西大神为了兼容性 在驱动配置文件中使用provider的方式进行兼容支持, 这也是为了保证升级到新驱动不会触发非常严重的问题, 并且让客户有机会回到到早前的微软驱动版本.

具体查看方法为:

查看安装应用服务器的全局配置文件 一般的目录为:

C:\Program Files\GenerSoft\bscw_local\gsp\config

文件名:GSPUniversalConfiguration

配置节为:GSPDbConfigurations

具体的配置节点:Provider="Oracle.DataAccess.OracleClient" 

provider 后面 ="" 可以理解为使用微软默认的驱动进行连接

如果后面为 :Oracle.DataAccess.OracleClient 可以理解为使用Oracle的ODP.net驱动进行连接

关于ODP.net驱动的版本:

一般可以理解为 环境变量下第一个OracleHOME目录下相关的ODP.net内的驱动.

平台技术部为了提供部署 效率也为了缓解Oracle客户端版本不一致造成的环境复杂度, 再发布GS7.0最新版本的时候同时支持了 Oracle客户端的绿色部署

实际上的做法为:

安装一个Oracle的ODAC,然后注册oracle的组件,以及安装OracleMTSrecoverry服务

针对x86和x64有两个不同的ODAC客户端文件.

如果使用绿色客户端,或者不想使用oracle的NETCA下面的tns配置文件,可以使用ip:port/serviceid 的方式进行连接.

4. 关于两种驱动的优缺点:

老驱动的兼容性更好一些, 并且十几年的使用 一般不会出现比较大的bug.

但是问题也还是有很多:

1. 发现在使用旧驱动加Oracle12.1.0.2 版本以后最重要的制单功能里面获取凭证内码的存储过程只能获取到一位数 还不能实时获取到具体的内码数(大于10个凭证意味着内码一定重复了)

2. oracle12c以后的一些新特性设置更早的一些特性比如bulkcopy批量插入, 内存数据库等的特性旧驱动无法支持,性能不好

3. 某些查询情况下针对特定的Oracle小版本,比如11.2.0.2以及之前的11.2.0.1版本会出现查询取数翻倍的情况. 造成验证的数据问题.

新驱动的话性能好一些, oracle的官方支持也比较大一些,但是也存在一些问题:

1. 测试时发现oracle.dataaccess 4.121.2 release4 的版本时 产品运行一段时间会出现批量的报错,造成应用服务器宕机 回退到 4.121.2 release 3 的版本就没有这个问题.

也是因为这个问题: 因为GS7新版本发布时oracle的 ODAC没有发布12.2的版本,所以只能再应用服务器的安装文件中集成了12.1.0.2 的release 3 版本的ODAC ,造成绿色安装Oracle客户端的驱动不是最新版本 而只是12.1.0.2 的release 3的版本

2. 一些比较早的或者比较复杂的SQL写法的情况下使用新驱动可能会有错误,这对测试要求比较高一些,需要注意一些边角的功能 主流程一般都不会有问题.

3. 如果使用绿色版的情况下一些类似MDM或者是其他库取数的功能, 可能需要修改配置文件, 因为可能没有tns配置文件 没法在应用服务器上面定义netca里面的oracle sid 需要在应用服务器里面使用 ip:port/serviceid的方式来进行使用.

4. 新驱动兼容支持了bulkcopy 但是从召冠总的一些blog和他的个人分析发现, bulkcopy虽然能够在大数据量情况下让的插入性能有几十倍的提高, 但是对一些索引较多的业务表(尤其像是产品的权限表)进行bulkcopy处理时可能会造成索引失效, 引起非常严重的性能下降.他的分析应该是bulkcopy批量插入时应该是先讲索引置为无效插入完成后再修改索引状态重新生成或者其他, 但是可能多次处理之后出现异常,造成索引invalid 造成查询权限表变成table full scan 引起严重问题.

暂时想到着一些.以后随时补充.