MongoDB數(shù)據(jù)庫介紹和Java使用

MongoDB簡介

????????MongoDB是一個開源的面向文檔存儲的NoSQL數(shù)據(jù)庫,它沒有了表結(jié)構(gòu)的概念和數(shù)據(jù)結(jié)構(gòu)的限制厂置;一個數(shù)據(jù)庫包含多個集合菩掏,每個集合理論上包含無數(shù)個文檔,每個文檔就是一條記錄昵济;每個文檔的格式都是BSON格式智绸,BSON是一種類JSON的一種二進制形式的存儲格式,簡稱Binary JSON;文檔的最大存儲空間是16M访忿,當文件大小超過16M之后要使用MongoDB的GridFS瞧栗;GridFS適合大文件的存儲,本質(zhì)上是將大文件拆成多個小文檔進行存儲海铆。
????????MongoDB其他特點如下:
????????1迹恐、技術(shù)成熟,相關(guān)工具和文檔支持較好卧斟,支持Java殴边、C、C++珍语、PHP等多種語言找都。
????????2、可以創(chuàng)建數(shù)據(jù)鏡像廊酣,擴展性強。
????????3赏枚、在高負載的情況下亡驰,可以通過分片技術(shù)增加節(jié)點保證服務(wù)器性能,支持分布式集群饿幅。
????????4凡辱、每個數(shù)據(jù)庫都分成一個主數(shù)據(jù)庫和兩個從數(shù)據(jù)庫,安全性高栗恩。
????????5透乾、支持完全的索引:單鍵索引、多鍵索引、數(shù)組索引乳乌、全文索引捧韵、地理位置索引。
????????6汉操、性能高且穩(wěn)定再来。
????????7、每個文檔可以創(chuàng)建多個鍵值對磷瘤,利于排序芒篷,業(yè)務(wù)開發(fā)更方便。

對Java語言的支持

????????在 Java 程序中如果要使用 MongoDB采缚,需要安裝了 Java 環(huán)境及 MongoDB JDBC驅(qū)動针炉。MongoDB JDBC驅(qū)動的名稱叫做mongo-java-driver,只需要將該Jar包包含在classPath中或集成進項目中即可。
mongo-java-driver中提供的API簡單易懂扳抽,操作非常簡單篡帕,具體示例代碼如下:
????????1、 創(chuàng)建數(shù)據(jù)庫示例代碼如下:

            try {  
            //連接到MongoDB服務(wù) 如果是遠程連接可以替換“l(fā)ocalhost”為服務(wù)器所在IP地址  
            //ServerAddress()兩個參數(shù)分別為 服務(wù)器地址 和 端口  
            ServerAddress serverAddress = new ServerAddress("localhost",27017);  
            List<ServerAddress> addrs = new ArrayList<ServerAddress>();  
            addrs.add(serverAddress);  
              
            //MongoCredential.createScramSha1Credential()三個參數(shù)分別為 用戶名 數(shù)據(jù)庫名稱 密碼  
            MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray());  
            List<MongoCredential> credentials = new ArrayList<MongoCredential>();  
            credentials.add(credential);  
              
            //通過連接認證獲取MongoDB連接  
            MongoClient mongoClient = new MongoClient(addrs,credentials);  
              
            //連接到數(shù)據(jù)庫  
            MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");  
            System.out.println("Connect to database successfully");  
        } catch (Exception e) {  
            System.err.println( e.getClass().getName() + ": " + e.getMessage() );  
        }  

????????2摔蓝、 創(chuàng)建集合示例代碼如下:
mongoDatabase.createCollection("test");

????????3赂苗、 插入文檔示例代碼如下:

         append("description", "database").  
         append("likes", 100).  
         append("by", "Fly");  
         List<Document> documents = new ArrayList<Document>();  
         documents.add(document);  
         collection.insertMany(documents);  
         System.out.println("文檔插入成功");  

????????4、 更新文檔示例代碼如下:

//更新文檔   將文檔中l(wèi)ikes=100的文檔修改為likes=200   
collection.updateMany(Filters.eq("likes", 100), new Document("$set",new Document("likes",200)));  

????????5贮尉、 刪除文檔示例代碼如下:

//刪除符合條件的第一個文檔  
         collection.deleteOne(Filters.eq("likes", 200));  
         //刪除所有符合條件的文檔  
         collection.deleteMany (Filters.eq("likes", 200));  

????????6拌滋、大文件存儲(超過16M),GridFS使用示例如下:

//獲取GridFS
GridFS gridFS = new GridFS(db, "fs");
//保存文件
File file = new File("c:\\testBig.zip");
GridFSInputFile gridFSFile = gridFS.createFile(file);
gridFSFile.save();
//查找文件
BasicDBObject query = new BasicDBObject();
query.put("filename", fileName);
GridFSDBFile gridFSOne = gridFS.findOne(query);

????????MongoDB數(shù)據(jù)庫中大文件(超過16M)存儲情況如下:


1.png

????????左側(cè)集合中有兩項猜谚,一個是fs.files,一個是fs.chunks败砂。其中fs.files中存儲文件的基本信息和此次記錄的唯一ID,如上圖所示魏铅。fs.chunks集合中分塊存儲實際的文件昌犹,每一塊中都包含一個遞增的序號和在fs.files對應(yīng)的記錄ID,如下圖:


2.png

性能分析

????????MongoDB的性能非常強勁和穩(wěn)定览芳,廣受使用者的好評斜姥。根據(jù)MongoDB官網(wǎng)測試報告,最新版本的MongoDB3.0在性能表現(xiàn)上更是比以前提升了一大截沧竟。
????????1铸敏、并發(fā)量
????????在YCSB測試中,MongoDB3.0在100%寫操作的情況下悟泵,可達225000 ops/sec杈笔;在95%讀操作、5%寫操作的情況下糕非,可達300000 ops/sec蒙具;在50%讀球榆、50%寫的情況下,可達150000 ops/sec禁筏。
????????2持钉、響應(yīng)延遲
????????在性能測試中僅僅監(jiān)測并發(fā)量是不夠的,我們還要考慮操作的響應(yīng)延遲 融师。在讀操作響應(yīng)延遲上右钾,MongoDB3.0穩(wěn)定的保持在1ms甚至更小的數(shù)值內(nèi);在平衡(讀寫各50%)的工作負荷下旱爆,MongoDB3.0也能穩(wěn)定的保持在1ms左右舀射。
????????YCSB測試配置如下:3千萬的文檔和3千萬的操作;文檔包含一個100字節(jié)的字段(總共151字節(jié))怀伦。
????????服務(wù)器都是具有下列規(guī)格的Softlayer 裸機:
????????1脆烟、CPU: 2x Deca Core Xeon 2690 V2 – 3.00GHz (Ivy Bridge) – 2 x 25MB cache;
????????2、 RAM: 128 GB Registered DDR3 1333;
????????3房待、 Storage: 2x 960GB SSD drives, SATA Disk Controller;
????????4邢羔、 Network: 10 Gbps;
????????5、 Ubuntu 14.10 (64 bit);
????????6桑孩、 MongoDB Versions: MongoDB 2.6.7; MongoDB 3.0.1
????????詳細測試報告見:https://www.mongodb.com/blog/post/performance-testing-mongodb-30-part-1-throughput-improvements-measured-ycsb

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拜鹤,一起剝皮案震驚了整個濱河市毅桃,隨后出現(xiàn)的幾起案子饶唤,更是在濱河造成了極大的恐慌,老刑警劉巖洼冻,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宣虾,死亡現(xiàn)場離奇詭異惯裕,居然都是意外死亡,警方通過查閱死者的電腦和手機绣硝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門蜻势,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鹉胖,你說我怎么就攤上這事握玛。” “怎么了甫菠?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵败许,是天一觀的道長。 經(jīng)常有香客問我淑蔚,道長,這世上最難降的妖魔是什么愕撰? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任刹衫,我火速辦了婚禮醋寝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘带迟。我一直安慰自己音羞,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布仓犬。 她就那樣靜靜地躺著嗅绰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搀继。 梳的紋絲不亂的頭發(fā)上窘面,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音叽躯,去河邊找鬼财边。 笑死,一個胖子當著我的面吹牛点骑,可吹牛的內(nèi)容都是我干的酣难。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼黑滴,長吁一口氣:“原來是場噩夢啊……” “哼憨募!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起袁辈,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤菜谣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吵瞻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葛菇,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年橡羞,在試婚紗的時候發(fā)現(xiàn)自己被綠了眯停。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡卿泽,死狀恐怖莺债,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情签夭,我是刑警寧澤齐邦,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站第租,受9級特大地震影響措拇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慎宾,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一丐吓、第九天 我趴在偏房一處隱蔽的房頂上張望浅悉。 院中可真熱鬧,春花似錦券犁、人聲如沸术健。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荞估。三九已至,卻和暖如春稚新,著一層夾襖步出監(jiān)牢的瞬間勘伺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工枷莉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娇昙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓笤妙,卻偏偏與公主長得像冒掌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蹲盘,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容