C# 使用OCCI 连接Oracle 数据库
C# 使用OCCI 连接Oracle 数据库
最近因需要研究了一下C#向Oracle数据库中插入数据的问题,通常情况下使用微软自带的组件ADO.NET来连接并操作数据库,这也是最简便的方式,用法也比较简单,即在程序开头加上using System.Data.OracleClient。另外就是使用Oracle提供的ODP.net,这需要下载ODAC,并在程序中引用Oracle.DataAccess.dll。
接下来写程序测试向数据库中插入记录的速度了,首先尝试使用ADO.net。
部分代码如下:
- OracleConnection conn=new OracleConnection(“Data Source=db;User id=user;Password=pass”);
- conn.Open();
- OracleCommand cmd=new OracleCommand();
- cmd.Connection=conn;
- OracleTransaction trans=conn.BeginTransaction();
- cmd.Transaction=trans;
- Stopwatch stp=new Stopwatch();
- cmd.CommandText=”insert into dbk_test values(to_date(’2012-06-05 10:00:00′,’yyyy-mm-dd hh24:mi:ss’),’1234567890′,’987654321′,’This is a test message’)”;
- for(int i=0;i<20000;++i)
- {
- cmd.ExecuteNonQuery();
- if(i%1000==0)
- trans.Commit();
- }
- trans.Commit();
- conn.Close();
- stp.Stop();
- Console.writeLine(“Time Elapsed:”+stp.ElapsedMilliseconds+”ms”);
C#程序运行在Windows Server 2008 32位上,机器为Xeon E552O * 2,2.27Ghz,共16核内存12GB。Oracle 安装在RedHat AS4U4,cpu为AMD Opterron 275 * 2 ,2.2GHz,共4核心,内存16GB,oracle 10g。
测试结果为33秒左右,每秒插入不到700条,之后也采用了绑定变量及调用存储过程等方法,插入速度也没有多大提高。
于是想到了用ODP.net,在网上查到说ODAC的版本必须与安装的oracle对应,虽然这个要求感觉不太灵活,因为实际的使用环境可能与开发环境不一致,到时还要更换ODAC的版本,且ODAC在官网上并不是能对应上所有的Oracle版本。在网上看到使用ODP.net插入速度可以达到数万条每秒,但我多次尝试时,都在运行时出现问题,根本无法运行成功。于是便放弃了。Oracle与MS的东西兼容性不强,或者说是Oracle本身向下兼容的能力弱,真是令人抓狂。
多方查找后发现了OCI这个东西,于是想到了使用封装了OCI的OCCI,这样眼前突然一亮。之后的思路就很清淅了,先用c++做一个dll,里面的函数是对OCCI的进行一步封装,再用c#调用这个dll就可以了。下面就是实现的具体过程了。
|
评论暂时关闭