C#开发如何选择Oracle驱动——Oracle官方驱动 VS 微软驱动

[复制链接]
查看11 | 回复9 | 2013-10-25 08:53:56 | 显示全部楼层 |阅读模式
本帖最后由 Hoegh 于 2015-7-21 14:27 编辑
最近在数据库开发和部署中,遇到一个问题——到底是选择Oracle官方驱动Oracle.ManagedDataAccess.Client还是微软的数据库驱动System.Data.OracleClient?
简单介绍一下我们的开发环境:

数据库架构:C/S结构
开发语言:C#
操作系统:Windows Server 2008
数据库版本:Oracle 10.2.0.4

之前我们一直使用微软驱动,存在一个问题——DateTime类型无法存储ms数据。数据库列定义为DateTime类型,应用程序中的数据在写库时,ms数据会被截掉。
具体可以参看博客http://blog.itpub.net/30162081/viewspace-1561171/
后来,在部门架构师的建议下统一更换为Oracle官方驱动(主要理由除了解决上述问题外,Oracle驱动的效率更高),但是遇到了一个更棘手的问题——数据库运行一段时间后,会由于连接数达到上限导致ORA-12516。
具体可以参看博客:http://blog.itpub.net/30162081/viewspace-1703627/
请问,大家对这两个驱动有研究吗,有没有遇到过上述两个问题?
我现在还是倾向于选择Oracle官方驱动,因为微软驱动已经不再更新,但是ORA-12516是个跨不过去的坎儿。



回复

使用道具 举报

千问 | 2013-10-25 08:53:56 | 显示全部楼层
是不是没 close session 啊?
回复

使用道具 举报

千问 | 2013-10-25 08:53:56 | 显示全部楼层
ODP.NET
回复

使用道具 举报

千问 | 2013-10-25 08:53:56 | 显示全部楼层
zixinsu 发表于 2015-7-21 20:13
是不是没 close session 啊?

用的是连接池
回复

使用道具 举报

千问 | 2013-10-25 08:53:56 | 显示全部楼层
本帖最后由 IT渔夫 于 2015-7-22 14:55 编辑
最近一两年没有出现过楼主所说的这类问题,我们很多服务程序,包括WEB程序都是用的C#或者C++,连接oracle,用的都是ORACLE提供的访问组件,windows操作系统,都没有问题。ORACLE提供的组件相比微软的,有很多优势,尤其是在内存占用控制方面。
早几年倒是出现过用微软的数据访问组件,导致PGA飙升(那个时候还是9i的数据库),最终导致机器内存全部耗尽。应该按道理来说,你们每个后台服务都有统一的数据访问层吧,一个后台服务的数据库连接应该只有1-2个样子吧。还有,你可以尝试架设一个oracle11.2的数据库试试,是不是针对oracle10的独有问题。
关于安装oracle数据访问组件的问题,我记得之前我们针对oracle10的版本时,是没有安装的,只需要把ORACLE.ACCESS.DLL(具体名字忘记了)添加到C#或C++后台服务的DLL引用目录就可以了,现在的我不知道可不可以,因为这个组件版本升级了,目前我这里也是都安装了组件,楼主可以去尝试一下。
你们的连接字符串怎么写的?我记得我们当初出现导致PGA飙升的最后的解决办法是修改了连接字符串写法解决的。


回复

使用道具 举报

千问 | 2013-10-25 08:53:56 | 显示全部楼层
IT渔夫 发表于 2015-7-22 14:36
最近一两年没有出现过楼主所说的这类问题,我们很多服务程序,包括WEB程序都是用的C#或者C++,连接oracle, ...

首先,谢谢你的关注。
1.如你所言,我们有一个统一的数据访问层,现在使用微软驱动的情况下,查询v$session,每个终端的session数一般是1-2;但是换成Oracle驱动,这个session数量会猛增;
2.在数据访问层,我们提供了一个接口,定时访问数据库(1s),用作数据库连接监视器,使用的是select 1 fromdual;
3.不知道您提到的安装数据访问组件是指什么,我们之前用Oracle驱动时,是直接把Oracle.ManagedDataAccess.Client添加到引用中;
4.附上我们的连接字符串,是在程序的.config文件中配置的:



上面两个连接字符串,上面那个是针对Oracle驱动,下面是针对微软驱动的。
目前,我们不得不退回使用微软驱动。
回复

使用道具 举报

千问 | 2013-10-25 08:53:56 | 显示全部楼层
本帖最后由 IT渔夫 于 2015-7-23 15:11 编辑
Hoegh 发表于 2015-7-23 13:46
首先,谢谢你的关注。
1.如你所言,我们有一个统一的数据访问层,现在使用微软驱动的情况下,查询v$sess ...
首先,我这边的项目web.config连接字符串是下面的写法:

二,我们使用ORACLE组件的方法,是在WEB服务器或后台服务器上安装ODTwithODAC112030(这个是最新版本吧),可以从http://www.oracle.com/technetwor ... tilsoft-086879.html这里下载。安装好后,在服务器下会存在D:\app\Administrator\product\11.2.0\client_1\这样类似的目录(我们这边是装D盘),然后在D:\app\Administrator\product\11.2.0\client_1\odp.net\bin\4(这个应该是针对.NET 4.0框架的) 目录下会有Oracle.DataAccess.dll 这个文件,D:\app\Administrator\product\11.2.0\client_1\odp.net\bin这个目录下还有一个针对2.0框架的,看你的程序使用框架,引用不同版本的Oracle.DataAccess.dll ,在后台服务或WEB程序引用Oracle.DataAccess.dll这个文件,就可以引用了,using Oracle.DataAccess.Client;
下面的文章是介绍不用装ODTwithODAC就可以使用ORACLE组件的方法,你可以尝试下:
http://www.cnblogs.com/gisdream/archive/2012/05/19/2508996.html

另外如果装了ODTwithODAC导致其他程序无法访问数据库了,是需要到D:\app\Administrator\product\11.2.0\client_1\Network\Admin这个目录增加tnsnames.ora文件(配置好数据库连接信息)。

回复

使用道具 举报

千问 | 2013-10-25 08:53:56 | 显示全部楼层
估计还是程序中某个代码没有合理释放连接,
如果程序没有close连接同时也忘了close statement的话
通过v$open_cursor里的sql来看看那些泄漏的连接之前做过什么,大概可以判断是什么程序没有合理释放连接
回复

使用道具 举报

千问 | 2013-10-25 08:53:56 | 显示全部楼层
理论上,新出的驱动比较好
回复

使用道具 举报

千问 | 2013-10-25 08:53:56 | 显示全部楼层
本帖最后由 Fishwood 于 2015-12-7 09:20 编辑
来点实际的,我们开发的软件平台,支持这两种驱动,前两年由于11g并不普及,所以采用了oracle10g和微软驱动,但是在使用过程中,有一次发现,一条比较复杂的SQL语句,在PLSQL下执行查询,数据正常,但是在微软驱动下,数据会增加1/3,多方查资料无所获,后来想到可能是微软驱动的bug,毕竟oracle不是微软开发的,支持上可能有问题,于是更换了oracle11g和Oracle自身的.net驱动,结果查询结果正常,后来网上资料也显示会有类似bug,但资料非常少。
再后来,由于要评估两个驱动性能问题,我们做了很多测试,发现Oracle自身驱动比微软驱动效率要高很多,几乎要高一倍多。比如微软驱动要执行10秒的语句,Oracle驱动只需3秒左右,绝大部分语句执行上,效率明显比微软驱动高。
所以,我们后面向客户推荐的都是11.1.7g或12g的版本,配合oracle驱动来搭建环境。你们架构设计和我们的方向基本一致,微软驱动有不可避免的bug,至于楼主说的ORA-12516,我从未遇到过。
希望对楼主有用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行