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、 插入文档示例代码如下:

         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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容