最近想通了,辞了职,原本谈好的新公司offer也给推掉,义无反顾的和朋友开始做自己的产品,反正明年毕业,失败了也没什么损失。主做应用服务器的客串android/windows phone客户端,计划未来iphone(当然赚到票票再说)。

简单拟定了下产品的文档,下面是整个服务器的架构示意图:

对于社交类型的系统,数据库的I/O注定会成为一大瓶颈,单点数据库体系肯定应付不了如此大的访问量,像facebook,twitter,foursquare之类的社交型平台都有自己的一套方案来解决数据库瓶颈问题。一开始我在持久化框架的选取上我的注意力放在了iBatis和hibernate上,虽然表面上hibernate用起来简单,但是若想将其性能发挥到极致还是很有难度的,iBatis的sql mapping半自动化方案反而使性能优化更加灵活。就在考察这两个框架本身的性能以及与缓存、分布式的应用过程中无意间发现了mongodb这个东西,早在一年前就在jdon上看到过板桥先生关于nosql替代关系型数据库的言论,不过当时才疏学浅一直不明白什么是key-value型的数据库,正好这次有机会领教一下传说中的nosql。查阅了官方的文档和网上的讨论以及morphia-0.95这个支持mongodb的orm框架后,我决定在这个项目中大胆尝试采用mongodb+morphia做持久层。

首先认识下mongodb,从http://www.mongodb.org/display/DOCS/Home下载到对应的版本(建议下载64位版本,这样可以突破32位系统的单文件2GB限制),解压后在bin中既是mongodb的所有程序文件(很绿色吧~~)

为方便使用,写一个脚本的方便以后启动mongodb服务器和客户端控制台。

server.cmd

@echo off
cd bin
mongod -port 27017 -dbpath "d:\mongodb\dbdata" run

client.cmd

@echo off
cd bin
mongo 127.0.0.1:27017

mongodb与普通的关系型数据库类似有Database的概念,但没有表的概念,取而代之的是collection,没有row的概念,取而代之的是document,事物支持比较弱。

使用mongodb api操作数据库示例

……

DBAddress dbServer_2 = new DBAddress("localhost:27017");
DBAddress dbServer_1 = new DBAddress("localhost:27018");
Mongo Mongo = new Mongo(dbServer_1, dbServer_2);
if(Mongo.authenticate("dokhell", "unikey"))
        throw DbAuthenticateException;

Set<String> names = Mongo.getDB("bestpro").getCollectionNames();
        DBCursor cursor = Mongo.getDB("bestpro").getCollection("bestpro").find();
        for(DBObject obj : cursor) {
            System.out.println(obj.get("a"));
        }
        DB db = Mongo.getDB("bestpro");
        Collection coll = db.getCollection("bestpro");

……

当然,我们还需要一套orm来简化我们的数据库访问机制。这里有一个开源的orm框架morphia对mongdb提供良好的支持。

//操作聚合实体与值对象

Morphia morphia = new Morphia();
        DBAddress dbAddr = new DBAddress("localhost:27017");
        Mongo m = new Mongo(dbAddr);
        BlogDao dao = new BlogDao(m, morphia, "bestpro");
        dao.deleteByQuery(dao.createQuery().field("title").equal("this is next blog222"));
       
        //System.out.println(dao.createQuery().limit(2).asList().get(1).getTitle());
        ArticalEntity blog = new ArticalEntity();
        //blog.setTitle("this is my fault222!`");
        //dao.save(blog);
        List<Comment> comments = new ArrayList<Comment>();
        Comment comment1 = new Comment();
        comment1.setName("comment1222");
        comment1.setContent("this is the comment's content");
       
        Comment comment2 = new Comment();
        comment2.setName("comment1222");
        comment2.setContent("this is the comment's content");
        comments.add(comment2);
        blog.setComments(comments);
       
        ArticalEntity nextBlog = new ArticalEntity();
        nextBlog.setTitle("this is next blog222");
        blog.setNextBlog(nextBlog);
        //InsertOrUpdate
        dao.save(nextBlog);//关联的聚合实体需要在被包含的实体持久化之前持久化
        dao.save(blog);
       
        blog.setTitle("应该能够能支持中文的,因为全是二进制数据");
        dao.save(blog);
        //QueryAndUpdate(special update form)
        //UpdateOperations ops = dao.createUpdateOperations().set("a", "2");
        //dao.update(dao.createQuery(), ops);
        //query
        QueryResults<ArticalEntity> entities = dao.find();
        System.out.println(entities.asList().get(0).getTitle());
        //pager
        System.out.println(dao.createQuery().offset(0).limit(1).asList().get(0).getTitle());

跨collection操作

Morphia morphia = new Morphia();
        DBAddress dbAddr = new DBAddress("127.0.0.1:27017");
        Mongo m = new Mongo(dbAddr);
        BlogDao blogDao = new BlogDao(m, morphia, "bestpro");
        PersonDao personDao = new PersonDao(m, morphia, "bestpro");
        PersonEntity person = new PersonEntity();
        person.setName("my name is ……");
        ArticalEntity artical = new ArticalEntity();
        artical.setTitle("this is a title");
        artical.setPerson(person);
        personDao.save(person);
        blogDao.save(artical);

相关资源链接:

mongodb quick start

http://www.mongodb.org/display/DOCS/Quickstart

mongodb驱动jar包+morphia的jar包下载:

http://files.cnblogs.com/wJiang/mongo_dev.rar

转载于:https://www.cnblogs.com/wJiang/archive/2010/10/12/1849312.html

高性能服务器架构之路-MongoDB(一):MongoDB快速入门(java版)(草稿)相关推荐

  1. 高性能服务器架构(High-Performance Server Architecture)

    原文: https://blog.csdn.net/marising/article/details/5186643 High-Performance Server Architecture 高性能服 ...

  2. 高性能服务器架构(High-Performance Server Architecture) .

    //  http://blog.csdn.net/bsplover/article/details/7498718 High-Performance Server Architecture 高性能服务 ...

  3. High performance server architecture(高性能服务器架构)

    from: http://pl.atyp.us/content/tech/servers.html http://www.cppblog.com/isware/archive/2011/07/19/1 ...

  4. python猜数字1001untitled_pytest封神之路第零步 快速入门

    背景:本文是在系列第五篇发表后的补充篇章,第一篇介绍了tep,可能对不熟悉pytest的朋友不够友好,特意补充入门篇,帮大家快速了解如何动手写pytest.如果你是从这篇文章第一次阅读,那么请忽略以上 ...

  5. linux socket recv函数如何判断收完一包_linux服务器端编程之高性能服务器架构设计总结...

    所谓高性能就是服务器能流畅地处理各个客户端的连接并尽量低延迟地应答客户端的请求:所谓高并发,指的是服务器可以同时支持多的客户端连接,且这些客户端在连接期间内会不断与服务器有数据来往. 这篇文章将从两个 ...

  6. 高性能服务器架构思路(五)——分布式缓存

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文由韩伟原创文章,转载请注明出处:  文章原文链接:https://www.qcloud.com/communit ...

  7. 高性能服务器架构思路「不仅是思路」

    在服务器端程序开发领域,性能问题一直是备受关注的重点.业界有大量的框架.组件.类库都是以性能为卖点而广为人知.然而,服务器端程序在性能问题上应该有何种基本思路,这个却很少被这些项目的文档提及.本文正式 ...

  8. web 服务器 内存 影响_高性能服务器架构思路「不仅是思路」

    在服务器端程序开发领域,性能问题一直是备受关注的重点.业界有大量的框架.组件.类库都是以性能为卖点而广为人知.然而,服务器端程序在性能问题上应该有何种基本思路,这个却很少被这些项目的文档提及.本文正式 ...

  9. 高性能服务器架构思路【不仅是思路】

    在服务器端程序开发领域,性能问题一直是备受关注的重点.业界有大量的框架.组件.类库都是以性能为卖点而广为人知.然而,服务器端程序在性能问题上应该有何种基本思路,这个却很少被这些项目的文档提及.本文正式 ...

最新文章

  1. 好家伙!JDK16 GA 终于发布,内置 Lombok 的功能,真的顶?
  2. InnoDB的MVCC如何解决幻读
  3. 垃圾回收在哪一章java_Java垃圾回收机制
  4. Python编程基础:第十五节 二维列表2D Lists
  5. iPhoneX 序列适配方案
  6. node js 技术架构_[视频] Node JS中的干净架构
  7. 深入研究微服务架构——第二部分
  8. oracle11g 日期型,Oracle11g: datetime
  9. 台式机dp接口_2K至4K显示器性价比线材选购攻略,毕亚兹 DP高清线入手
  10. 多方位全面解析:如何正确地写好一个iOS UI
  11. 商品管理查询分类下的所有子类目
  12. 原子和非原子oc_原子宝藏
  13. 中兴GWH-11 ZXV10 H108B的AD路由器获取超级用户密码
  14. 什么是数字化转型? 怎样算是转型?
  15. 地球系统模式CESM学习记录
  16. 什么是“ Gacha”视频游戏?
  17. 接口技术课程设计——一种基于MFC构造自动测量系统
  18. java button中文乱码_java解决中文乱码的几种写法
  19. 开班倒计时!12月1日—CDA数据分析就业班火热报名中
  20. 如何使用phpunit运行单一测试方法?

热门文章

  1. html设置字体对其方式,css中通过属性( )设置字体的水平对齐方式
  2. 计算机屏幕闪烁黑屏,显示器屏幕一闪一闪的黑屏怎么办_电脑屏幕黑屏一闪一闪如何解决...
  3. 你不知道的CSS特效
  4. 北大java面试,北大青鸟java 面试--常见面试题(下)
  5. 从杀慢查询入手来预防 MySQL 雪崩的办法
  6. [RK3288][Android6.0] 移植笔记 --- 13.3寸eDP显示屏添加
  7. 《秘密》卷一:秘密-吸引力法则
  8. Python数据分析之数据抓取 part 1
  9. #论文投稿必备#如何解决阅读文献的三大问题:坐不住,记不住,想不开
  10. Android Studio Canvas 实现鼠标贝塞尔曲线拖尾特效