最近因需要研究了一下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就可以了。下面就是實現的具體過程了。