幾年的工作下來,也使用過好幾種數(shù)據(jù)庫,準(zhǔn)確點(diǎn)來說是“數(shù)據(jù)庫管理系統(tǒng)”,有關(guān)系型數(shù)據(jù)庫,也有NoSQL。
關(guān)系型數(shù)據(jù)庫:
1.MySQL:開源,性能高,成本低,可靠性高(這些特性往往讓他成為很多公司和項(xiàng)目的首選數(shù)據(jù)庫),單拿大規(guī)模網(wǎng)站應(yīng)用來說,我們熟知的如維基百科,Google,和Facebook都是采用的MySQL。但是目前Oracle對MySQL的收購也許會讓我們對MySQL免費(fèi)應(yīng)用的前景產(chǎn)生一些擔(dān)憂。
我的使用體驗(yàn):MySQL安裝很方便,幾乎在下一步下一步過程中就完成了。而且針對MySQL的操作和管理有很多第三方插件支持,我用過的有“MySQL Query Browser”,“Navicat for MySQL”,“SQLyogEnt”個人感覺從使用體驗(yàn)和響應(yīng)速度上SQLyogEnt更好。編程語言接口方面,MySQL幾乎支持所有的主流編程語言,我個人用過純C++的connector/c++,挺好用的,完全是按照J(rèn)DBC的規(guī)范封裝;java的JDBC,Hibernate;MFC的ODBC。
說幾個工作中遇到的MySQL的小問題(潛規(guī)則),不了解時在開發(fā)中著實(shí)給自己帶來了不少的困惑:
(1)案例:在一個通訊服務(wù)器中寫了個MySQL連接池,通過客戶端的調(diào)用獲取連接進(jìn)行相應(yīng)的數(shù)據(jù)庫操作,有時候會發(fā)現(xiàn)這樣一個問題,連接并不為空,但是進(jìn)行數(shù)據(jù)庫操作時卻失敗了,心中不免產(chǎn)生了大大的疑問,而且由于這種問題不好復(fù)現(xiàn),所以沒找到解決方案,最后經(jīng)過閱讀MySQL文檔才發(fā)現(xiàn)了導(dǎo)致問題產(chǎn)生的原因:MySQL的有效連接如果在8小時之內(nèi)沒有任何數(shù)據(jù)庫操作就會失效,靠空判斷是判斷不出來的,必須進(jìn)行有效性判斷,方法可以是隨便進(jìn)行個數(shù)據(jù)庫操作看是否報錯,針對連接池而言如果報錯就舍棄這個無效連接,再創(chuàng)建一個新的有效連接放入連接池。
(2)案例:MySQL最大連接數(shù)。這么簡單的問題?關(guān)于最大連接數(shù)大家都知道,MySQL一般默認(rèn)支持的最大連接數(shù)是100,也就是說你已經(jīng)創(chuàng)建了100個連接,再創(chuàng)建連接就會失敗,是吧,大家都知道:)可是不知大家是否知道對于PreparedStatement 也有最大個數(shù),不信你試試看,你去不斷地創(chuàng)建PreparedStatement,當(dāng)達(dá)到最大個數(shù)時,PreparedStatement 也會無效,不管此時你創(chuàng)建了幾個數(shù)據(jù)庫連接。
2.Microsoft SQL Server:以前的SQL Server適合于中小企業(yè)的數(shù)據(jù)庫解決方案,但是隨著新版本的推出,功能和性能的加強(qiáng) 已經(jīng)觸及到大型企業(yè)的數(shù)據(jù)庫管理。我新近才用過的是SQL Server 2005,對我有感觸的一個新功能是”強(qiáng)化XML的處理能力,并新增本地的XML數(shù)據(jù)類型,以及支持原生XML數(shù)據(jù)類型的XML查詢運(yùn)算符“。但是從SQL Server的獲得上來看,大家也知道,買正版是需要大量資金的,我想小公司一般不會考慮他吧。
我的使用體驗(yàn):安裝記不太清楚了,我只記得那時要安裝一大堆組件,進(jìn)行一系列配置,而且需要不小的磁盤空間,這從另一個側(cè)面反映了SQL Server的”復(fù)雜“,所以如果MySQL就能滿足你的開發(fā)需求,建議放棄SQL Server吧,而且從跨平臺考慮來看,那就直接可以讓他出局了。對于他的管理我使用的是微軟自帶的Management Studio,個人感覺挺好用的,第三方的有Navicat For SQL Server。在使用SQL Server時給我留下的印象比較深刻的一點(diǎn):配合Visual studio的服務(wù)器資源管理器調(diào)試存儲過程很爽。
3.SQLite:輕量級關(guān)系數(shù)據(jù)庫,但是完全支持ACID(原子性, 一致性,隔離性, 持久性),適合應(yīng)用于小型,單機(jī)的項(xiàng)目,其中有篇網(wǎng)絡(luò)文章詳細(xì)列舉了SQLite的相關(guān)資料,有入門知識,社區(qū),局限性介紹,感覺很好也很全,感興趣的哥們可以看下http://blog.csdn.net/wangguang246/article/details/6090289。
我的使用體驗(yàn):用過C++的CppSqlite(codeproject上有開源代碼)封裝,用過java的JDBC,用過QT的QSQLITE,都操作很簡單,但在QT遇到一個問題,不支持?jǐn)?shù)據(jù)庫操作的異常處理?(反正我沒發(fā)現(xiàn)),對SQLite考慮最多的局限性就是:不能做到面向表和行的鎖定力度,而是數(shù)據(jù)庫級的鎖定力度,所以要并發(fā)讀寫是不行了。第三方插件操作管理SQLite我使用的是SQLite Expert Professional,感覺挺好用的。
NoSQL:
mongoDB:開源的NoSQL數(shù)據(jù)庫,用c++編寫。以下引自開源中國社區(qū):“MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bjson格式,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點(diǎn)是他支持的查詢語言非常強(qiáng)大,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。
它的特點(diǎn)是高性能、易部署、易使用,存儲數(shù)據(jù)非常方便。主要功能特性有:
面向集合存儲,易存儲對象類型的數(shù)據(jù)。
模式自由。
支持動態(tài)查詢。
支持完全索引,包含內(nèi)部對象。
支持查詢。
支持復(fù)制和故障恢復(fù)。
使用高效的二進(jìn)制數(shù)據(jù)存儲,包括大型對象(如視頻等)。
自動處理碎片,以支持云計算層次的擴(kuò)展性
支持RUBY,PYTHON,JAVA,C++,PHP等多種語言。
文件存儲格式為BSON(一種JSON的擴(kuò)展)
可通過網(wǎng)絡(luò)訪問
所謂“面向集合”(Collenction-Orented),意思是數(shù)據(jù)被分組存儲在數(shù)據(jù)集中,被稱為一個集合(Collenction)。每個 集合在數(shù)據(jù)庫中都有一個唯一的標(biāo)識名,并且可以包含無限數(shù)目的文檔。集合的概念類似關(guān)系型數(shù)據(jù)庫(RDBMS)里的(table),不同的是它不需要定 義任何模式(schema)。
模式自由(schema-free),意味著對于存儲在mongodb數(shù)據(jù)庫中的文件,我們不需要知道它的任何結(jié)構(gòu)定義。如果需要的話,你完全可以把不同結(jié)構(gòu)的文件存儲在同一個數(shù)據(jù)庫里。
存儲在集合中的文檔,被存儲為鍵-值對的形式。鍵用于唯一標(biāo)識一個文檔,為字符串類型,而值則可以是各中復(fù)雜的文件類型。我們稱這種存儲形式為BSON(Binary Serialized dOcument Format)。
MongoDB服務(wù)端可運(yùn)行在Linux、Windows或OS X平臺,支持32位和64位應(yīng)用,默認(rèn)端口為27017。推薦運(yùn)行在64位平臺,因?yàn)镸ongoDB在32位模式運(yùn)行時支持的最大文件尺寸為2GB。”
我的使用體驗(yàn):我們在項(xiàng)目中使用MongoDB主要是針對日志存儲和讀取,因?yàn)槿罩玖亢艽?,用傳統(tǒng)的關(guān)系數(shù)據(jù)庫效率太低,而MongoDB在效率方面的表現(xiàn)相當(dāng)出色(主要是因?yàn)镸ongoDB采用內(nèi)存映射的關(guān)系吧),對于重要的業(yè)務(wù)邏輯還是使用關(guān)系數(shù)據(jù)庫,因?yàn)镸ongoDB不支持事務(wù),而且有一些反饋說MongoDB經(jīng)常會莫名其妙的丟失數(shù)據(jù),所以我們針對并不十分重要的日志儲存使用。還有一個問題,我們是使用服務(wù)啟動的MongoDB的服務(wù)端,在此服務(wù)異常退出時,MongoDB服務(wù)端在下次也不能正常啟動,這樣就會導(dǎo)致丟失數(shù)據(jù)的現(xiàn)象,需要手動刪除掉數(shù)據(jù)庫目錄下的一個鎖文件,MongoDB才能正常啟用。
以下是鏈接是MongoDB官網(wǎng)提供的對C++接口的的支持http://www.mongodb.org/pages/viewpage.action?pageId=133415, 如果你對json很了解,那么上手MongoDB一定會很快,對于java可以看以下鏈接”http://www.mongodb.org/display/DOCS/Java+Language+Center“,值得一提的是,依然有對ORM的支持morphia”http://code.google.com/p/morphia/wiki/QuickStart“。