標籤:
這半年手頭的一個項目,自己寫代碼的時候偏愛 MS SQL、部署伺服器裝的是 ORALCE 和 實際的現場是小型機,壓根沒有裝資料庫只好選用 ACESS ,三種環境不一致,才決定用 OLEDB 做資料庫訪問。之前忙於趕進度草草地封了幾個增刪改查的操作,年前閑下來做測試還發現了不少問題。趁著這幾天閑就從頭封裝了一次,做出單獨的一個簡單類出來。
為了調用的時候傳遞方便就直接從 IDbCommand 繼承過來,這樣傳參還是調用都留下了餘地,封裝很簡單直接上類圖
本文的小工具和封裝類,已經提交到了GIT
Toater_OSC Git 中的 DataBaseAcess 工程裡
這個版本的封裝提供了倆個簡單的選項
1.是否保持串連
執行命令後是否關閉串連的選項,因為發現在使用 ACESS 的時候如果頻繁開啟關閉檔案,指不定就會遇到 IO導致的錯誤,下面來由一組測試來說明 ACESS 在保持串連的情況下執行效率竟然超過了倆種主流資料庫。
2. 資料庫類型選擇
/// <summary>/// /// <summary>/// 建構函式/// </summary>/// <param name="connectionString">連接字串</param>/// <param name="dbType">資料庫類型</param>/// <param name="keepAlive">是否保持串連</param>public DBFairy(string connectionString, string dbType = DBType_Oracle, bool keepAlive = false){ // 非預設值檢查關鍵字匹配 if (!string.IsNullOrEmpty(dbType)) { if (DBType_Oracle != dbType && DBType_MSSQL != dbType && DBType_ACCESS != dbType) { throw new NotSupportedException("不受支援的類型描述,請使用 DBFairy.DBType 定義."); } _DBType = dbType; } _ConnectionString = connectionString; _AlwaysClose = !keepAlive; dbCommand.Connection = new OleDbConnection(_ConnectionString);}
測試了支援選項中的三種資料庫,下面是測試過程。
環境是 : Acer 台式機 ,I3 CPU ,4G 記憶體
方法是 : 三個後台線程,同時執行 資料庫操作
不過我還是很偏心地把 ACCESS 地調用放在了第一位,實在是因為大家都說小夥子太慢,才愛心地放在了第一位。
bgAcessWorker.RunWorkerAsync();bgMSWorker.RunWorkerAsync();bgOracleWorker.RunWorkerAsync();
在關閉串連的情況下的三次測試:
第一次:
第二次:
第三次:
在關閉串連的情況下 : MS SQL 和 Oracle 相差無幾,不過感覺上還是 ORACLE 略快, ACESS 操作時間基本在 2倍以上
問題 : 為毛 ACCESS 執行越來越快了?難道這是檔案 IO 緩衝的問題,或者進程調度優先了檔案?
在保持串連狀態下的三組測試:
第一次 : MSSQL和ORACLE基本還好之前的相差無幾的感覺,不過可以看出來,這裡的時間已經從 17000 減少到了 15000 ,不過在服務型的資料上,開關串連的損失不是很大。
再看一下 ACESS 明顯已經逆天了,直接秒殺了倆位老大。只用了10075 ,10秒左右插入了 1000 條記錄。
第二次:
第三次:
可能看到同事們紛紛離開工位,回家過年了,電腦也激動地越來越卡了,1000行的執行時間越來越長,不過對比結果還是很明顯的.
ACESS 在保持串連的狀態下,小量資料的插入速度還是很快的,趕超過了 MS SQL 和 ORACLE 。後倆者一直很默契,不離不棄地保持著不分不舍的步調。
(估計是今天情人節的原因吧 ^_^)
----------------------------------------------------------- MARK ----------------------------------------------------------------
------ MS SQL 這裡用的附加資料庫 ,VS 2013 內建了 虛擬 SQL的功能<add name="OLEDBConnectionString" connectionString="Provider=SQLNCLI11.1;Data Source=(LocalDB)\V11.0;Persist Security Info=False;Integrated Security=SSPI;Initial File Name=E:\OSChina\Source\Repos\Thenu.TinyHourseLib\THenu.TinyHourseLib\DataBaseAcess\WindowsFormsAcess\App_Data\StudentDB.mdf" providerName="System.Data.OleDb" /> --- ORACL <add name="OracleConnectionString" connectionString="Provider=MSDAORA.1;Data Source=orcl;Persist Security Info=True;Password=hhkj;User ID=hhkj" providerName="System.Data.OleDb" /> --- ACESS<add name="AccessConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\OSChina\Source\Repos\Thenu.TinyHourseLib\THenu.TinyHourseLib\DataBaseAcess\WindowsFormsAcess\App_Data\Student.mdb" providerName="System.Data.OleDb" />
關於連接字串,大家跟據自己的版本,選擇好 Provider , SQL 2005,2008 和 2012 使用不同的,而且對於服務資料和附加資料庫也有一點區別。Oracle 的常用的就是上面的方式,當然也可以選擇 Oralce 自己的OLEDB Provider 。
給大家推薦一個很全的連接字串參考網站:
www.connectionstrings.com
問題匯總部分實在來不及寫了, 不要罵我是騙子,著急中午回家洗襪子 就這一雙明天早上還要穿的,這部分年後再補錄吧
今天是情人節外加回家的大日子,作為資深屌絲也是有很多正事要做的
@MISS BingBing
各位OSCer 新年快樂,羊年吉祥,喜洋洋、美羊羊、懶洋洋,我是灰太狼。。。。
OLEDB 串連 和 效率(MS SQL 、Oracle 、ACESS)