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

摘要:
1.发展。net使用Oracle作为驱动程序。的ERP产品的初始版本。net line使用Microsoft提供的Oracle驱动程序。net1.1发布了,但看起来微软的。net产品线没有继续开发相应的驱动程序。Oracle已经发布了自己的ODP。net驱动程序版本由于一些历史原因,该产品一直运行在微软的驱动程序上,但毕竟,它是十多年前的驱动程序。由于性能差和许多bug,它已经越来越无法满足产品的需求。所以在2016年,公司决定

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

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

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

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

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

关于微软驱动的简介图:

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

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

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

 关于.net版本的说明:

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

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

摘自: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驱动问题说明第4张

核心dll以及版本:

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

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

4.112.0

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

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

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

具体查看方法为:

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

C:Program FilesGenerSoftscw_localgspconfig

文件名: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 引起严重问题.

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

免责声明:文章转载自《日常工作: 应用服务器Oracle驱动问题说明》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PostgreSQL:在Linux系统上面安装PostgreSQL数据库Jquery Math ceil()、floor()、round()比较与用法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle 性能调优之:使用 V$SQL_PLAN 视图查询内存中的执行计划

V$SQL_PLAN视图提供了一种方法,可用于检查仍位于库高速缓存的游标的执行计划。此视图中的信息与 PLAN_TABLE 视图中的信息非常类似。但是,EXPLAIN PLAN 显示的是执行相应语句时可以使用的理论,而V$SQL_PLAN 包含实际使用的计划。通过 EXPLAIN PLAN 语句获取的执行计划与用来执行游标的执行计划可能有所不同。原因在于,...

ORACLE 判断首字母大小写问题

1.对判断的字段进行拆分 select  substr(要区分的字段,0,1)  from 表 ; 得到一个 首字母 2.对这个字符进行大小写判断 查出以小写字符为开头的 select  substr(要区分的字段,0,1)  from 表  where  substr(要区分的字段,0,1)=lower((substr(要区分的字段,0,1) )) ;...

Oracle内部错误:ORA00600:[4097]一例

一套Linux上的10.2.0.4系统在异常恢复后(使用_allow_resetlogs_corruption隐藏参数打开后遭遇ORA-00600:[40xx]相关的内部错误,创建并切换到了新的撤销表空间上)出现ORA-00600: internal error code, arguments: [4097], [], [], [], [], [], []...

一些基本的Oracle命令

一些基本的Oracle命令基本命令 连接数据库 C:>SQLPLUS /NOLOG SQL>CONN / AS SYSDBA 1.Oracle 关闭 SQL>SHUTDOWN (ABORT|IMMEDIATE|NORMAL) 2.Oracle 启动 SQL>STARTUP (REMOUNT|MOUNT|OPENT) 3.SQL>...

Oracle 事务

Oracle事务 事务是什么 事务在数据库中是工作的逻辑单元,单个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制,可以确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行。   事务特性 SQL92标准对数据库事务的特点进行如下定义:   原子性(Atomicity):一个事务里面所有包含的SQL语句都是...

Oracle DBLINK 简单使用

oracle在进行跨库访问时,可以通过创建dblink实现,今天就简单的介绍下如果创建dblink,以及通过dblink完成插入、修改、删除等操作 首先了解下环境:在tnsnames.ora中配置两个数据库别名:orcl(用户名:wangyong 密码:1988)、orcl2(用户名:wangyong 密码:123456),在orcl中 创建databas...