1. 程式人生 > >MongoDB資料庫介紹和Java使用

MongoDB資料庫介紹和Java使用

MongoDB簡介

        MongoDB是一個開源的面向文件儲存的NoSQL資料庫,它沒有了表結構的概念和資料結構的限制;一個數據庫包含多個集合,每個集合理論上包含無數個文件,每個文件就是一條記錄;每個文件的格式都是BSON格式,BSON是一種類JSON的一種二進位制形式的儲存格式,簡稱Binary JSON;文件的最大儲存空間是16M,當檔案大小超過16M之後要使用MongoDB的GridFS;GridFS適合大檔案的儲存,本質上是將大檔案拆成多個小文件進行儲存。
        MongoDB其他特點如下:
        1、技術成熟,相關工具和文件支援較好,支援Java、C、C++、PHP等多種語言。
        2、可以建立資料映象,擴充套件性強。
        3、在高負載的情況下,可以通過分片技術增加節點保證伺服器效能,支援分散式叢集。
        4、每個資料庫都分成一個主資料庫和兩個從資料庫,安全性高。
        5、支援完全的索引:單鍵索引、多鍵索引、陣列索引、全文索引、地理位置索引。
        6、效能高且穩定。
        7、每個文件可以建立多個鍵值對,利於排序,業務開發更方便。

對Java語言的支援

        在 Java 程式中如果要使用 MongoDB,需要安裝了 Java 環境及 MongoDB JDBC驅動。MongoDB JDBC驅動的名稱叫做mongo-java-driver,只需要將該Jar包包含在classPath中或整合進專案中即可。
mongo-java-driver中提供的API簡單易懂,操作非常簡單,具體示例程式碼如下:
        1、 建立資料庫示例程式碼如下:

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

        2、 建立集合示例程式碼如下:
mongoDatabase.createCollection("test");

        3、 插入文件示例程式碼如下:

         Document document = new Document("title", "MongoDB").  
         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、 更新文件示例程式碼如下:

//更新文件   將文件中likes=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資料庫中大檔案(超過16M)儲存情況如下:
1.png
        左側集合中有兩項,一個是fs.files,一個是fs.chunks。其中fs.files中儲存檔案的基本資訊和此次記錄的唯一ID,如上圖所示。fs.chunks集合中分塊儲存實際的檔案,每一塊中都包含一個遞增的序號和在fs.files對應的記錄ID,如下圖:
2.png

效能分析

        MongoDB的效能非常強勁和穩定,廣受使用者的好評。根據MongoDB官網測試報告,最新版本的MongoDB3.0在效能表現上更是比以前提升了一大截。
        1、併發量
        在YCSB測試中,MongoDB3.0在100%寫操作的情況下,可達225000 ops/sec;在95%讀操作、5%寫操作的情況下,可達300000 ops/sec;在50%讀、50%寫的情況下,可達150000 ops/sec。
        2、響應延遲
        在效能測試中僅僅監測併發量是不夠的,我們還要考慮操作的響應延遲 。在讀操作響應延遲上,MongoDB3.0穩定的保持在1ms甚至更小的數值內;在平衡(讀寫各50%)的工作負荷下,MongoDB3.0也能穩定的保持在1ms左右。
        YCSB測試配置如下:3千萬的文件和3千萬的操作;文件包含一個100位元組的欄位(總共151位元組)。
        伺服器都是具有下列規格的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