`
ft4453080
  • 浏览: 14275 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

NoSql体验与MongoDB应用

阅读更多

     背景:与AJAX跨域问题的产生一样,系统里新增的即时聊天模块,关于聊天内容,是要保存历史记录的。因为即时聊天的特性,数据的保存和获取,需要即时的显示,采用传统关系型数据库,在用户过多的情况下可能就有性能问题了。所以转而考虑非关系型数据库。

      在了解了NoSql的类型和特点后。研究的重点放在了MongoDB和Redis这两种数据库上。在易用性上,MongoDB会好一些。MongoDB提供了比较好的查询功能。比较适合聊天模块的应用。所以最终采用的方式是MongoDB。

      对应传统关系型数据库。DB-->TABLE-->COLOUM。MongoDB中的层级结构是DB-->COLLECTION-->JSON数据(其实就是KEY--VALUE)

      

      JAVA应用MongoDB:管理类

import java.net.UnknownHostException;  

import com.mongodb.DB;  
import com.mongodb.Mongo;  
import com.mongodb.MongoException;  
import com.mongodb.MongoOptions;  
import com.troila.core.utils.PropertiesUtils;
  
public class MongoManager {  
    private final static String HOST = "xx.xx.xx.xx";// IP
    private final static int PORT = 27017;// 端口
    private final static int POOLSIZE = 1000;// 连接数量  
    private final static int BLOCKSIZE = 1000; // 等待队列长度  
    private static Mongo mongo = null;  
  
    private MongoManager() { }  
  
    static {  
        initDBPrompties();  
    }  
  
    public static DB getDB(String dbName) {  
        return mongo.getDB(dbName);  
    }  
  
    /** 
     * 初始化连接池 
     */  
    private static void initDBPrompties() {  
        // 其他参数根据实际情况进行添加  
        try {
        	
            mongo = new Mongo(HOST, PORT);
            MongoOptions opt = mongo.getMongoOptions();
            opt.connectionsPerHost = POOLSIZE;
            opt.threadsAllowedToBlockForConnectionMultiplier = BLOCKSIZE;
            opt.maxWaitTime = 5000;
            opt.autoConnectRetry = true;
            opt.socketKeepAlive=true;
            opt.socketTimeout = 2000;
            opt.connectTimeout = 15000;
        } catch (UnknownHostException e) {
        } catch (MongoException e) {
        }
  
    }  
} 

 插入举例

public void insertOneChat(String from_uid, String to_uid, String text,
			String sendTime) {
		DB db = MongoManager.getDB(DB_NAME);
		DBCollection chatTable = db.getCollection(CHAT_TABLE);
		db.requestStart();
		// 事务开始
		try {
			// 写信息
			DBObject newChat = new BasicDBObject();
			HashMap mp = new HashMap();
			mp.put(FROM_UID, from_uid);
			mp.put(TO_UID, to_uid);
			mp.put(CONTENT, text);
			mp.put(SEND_TIME, sendTime);
			System.out.println(mp);
			newChat.put(FROM_UID, from_uid);
			newChat.put(TO_UID, to_uid);
			newChat.put(CONTENT, text);
			newChat.put(SEND_TIME, sendTime);
			System.out.println(newChat);
			chatTable.insert(newChat);
			// 写未读标记
//			if(!this.hasNewMessage(to_uid, from_uid)){
			saveUnreadInfo(from_uid,to_uid);
//			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 事务结束
			db.requestDone();
		}
	}

 查询举例

public List queryChatMessageOneOnOne(String from_uid ,String to_uid) {
		DB db = MongoManager.getDB(DB_NAME);
		DBCollection table = db.getCollection(CHAT_TABLE);
		// 更新为已读(清理提醒表中与自己相关的信息)
		removeUnreadTable(from_uid ,to_uid);
		// 查询已读
		DBObject in_data = new BasicDBObject("$in",new Object[] { to_uid, from_uid });
		DBObject query = new BasicDBObject();
		query.put(FROM_UID, in_data);
		query.put(TO_UID, in_data);
		DBCursor cur = table.find(query);
		List<Map> list = new ArrayList<Map>();
		try {
			while (cur.hasNext()) {
				DBObject obj = cur.next();
				Map map = new HashMap();
				map.put("from_uid", obj.get(FROM_UID));
				map.put("to_uid", obj.get(TO_UID));
				map.put("content", obj.get(CONTENT));
				map.put("send_time", obj.get(SEND_TIME));
				map.put("msg_type", "1");
				list.add(map);
			}
		} finally {
			cur.close();
		}
		return list;
	}

 删除举例

	public void removeUnreadTable(String from_uid, String to_uid) {
		DB db = MongoManager.getDB(DB_NAME);
		DBCollection table = db.getCollection(REMIND_TABLE);
		DBObject deleteQuery = new BasicDBObject();
		deleteQuery.put(FROM_UID, from_uid);
		deleteQuery.put(TO_UID, to_uid);
		table.remove(deleteQuery);
	}

 修改举例

@Override
	public void updateUnread(DBObject mongoObj) {
		// TODO Auto-generated method stub
		DB db = MongoManager.getDB(DB_NAME);
		DBCollection invite = db.getCollection(INVITE_TABLE);
		db.requestStart();
		try {
			
			DBObject uptObj = mongoObj;
			DBObject oldObj = invite.findOne(mongoObj);
			uptObj.removeField(IS_READED);
			uptObj.put(IS_READED, "1");
			
			invite.update(oldObj, uptObj);
		}catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			db.requestDone();
		}
	}

 除了增删改查之外。

值得一提的是upsert:是一种先查询如果查到记录就更新,查不到记录就增加的记录的数据处理方式。

另外一个要说的是修改操作的时候除了修改某个KEY的VALUE之外,这个KEY也是可以修改的。

 

分享到:
评论

相关推荐

    NoSQLBooster for MongoDB

    NoSQLBooster提供了一系列功能,旨在提升MongoDB的使用体验: 1. **图形化用户界面(GUI)**:NoSQLBooster提供了一个直观的GUI,允许用户通过简单的拖放操作和清晰的布局来执行查询、插入、更新和删除操作,极大地...

    Mac OS版 nosqlbooster mongodb可视化工具

    压缩包子文件的文件名称"nosqlbooster4mongo-5.0.0.dmg"表明这是NosqlBooster 4 MongoDB的5.0.0版本的安装文件,后缀".dmg"是Mac OS特有的磁盘映像格式,用于存放应用程序和相关文件。用户只需双击该文件,按照提示...

    NoSQL Manager for MongoDB

    4. **MongoDB应用领域** - **Web应用**:快速响应动态数据需求,适合内容管理系统、电子商务平台等。 - **大数据分析**:支持水平扩展,适用于处理海量非结构化数据。 - **实时应用**:低延迟读写,适用于实时...

    nosqlbooster4mongo-6.2.10,MongoDB连接工具

    在安全方面,NosqlBooster4mongo支持SSL连接,加强了与MongoDB服务器之间的通信加密,确保敏感数据在传输过程中不被窃取。同时,该工具也支持MongoDB身份验证机制,如SCRAM-SHA-1和x509,增强了数据库访问的安全性。...

    mongodb的小例子

    作为一个非关系型数据库(NoSQL),MongoDB不使用传统的表和列结构,而是使用JSON格式的文档来存储数据,这使得它非常适合处理半结构化和结构多变的数据。 在"mongodb的小例子"中,我们可以预期这个压缩包包含了...

    《Node应用程序构建:使用MongoDB和Backbone》 源码

    2. **MongoDB**:MongoDB是一个流行的开源NoSQL数据库系统,它使用JSON-like文档格式存储数据,具有高性能、高可用性和可扩展性。MongoDB支持动态模式,易于快速开发,适合处理大量半结构化或非结构化数据。 3. **...

    MongoDB可视化工具

    在处理大量数据时,尤其是对于那些适合文档型数据结构的应用场景,MongoDB提供了一个高效的数据存储解决方案。然而,尽管MongoDB的命令行界面(CLI)功能强大,但在复杂的数据库管理和开发过程中,可视化工具的使用...

    Laravel开发-mongodb MongoDB 数据库驱动

    通过`laravel-mongodb-master`这个压缩包,你可以找到更多示例和代码实现,以便更好地理解和应用MongoDB与Laravel的结合。 总之,Laravel开发-mongodb MongoDB 数据库驱动让我们能够在Laravel项目中无缝地使用...

    MongoDb多数据中心

    MongoDB作为一个高性能、高可用性、以及易于扩展的开源NoSQL数据库,被广泛应用于需要处理大量数据的场景中。随着业务的发展,单一数据中心往往难以满足地理分布、数据可用性和合规性等需求。这时,多数据中心部署...

    MongoDB服务及行业应用方案概述.pdf

    - **集成Akamai技术**:利用Akamai领先的CDN技术、云压力测试工具、用户体验监控系统以及应用性能管理工具,帮助企业持续优化应用程序性能,提升用户体验,增强市场竞争力。 ##### 3. **数据库 - MongoDB** - **...

    数据库技术沙龙ppt:NoSQL应用实践

    #### NoSQL发展历程与应用实践概述 在《数据库技术沙龙PPT:NoSQL应用实践》中,演讲嘉宾杨海朝通过一系列的实际案例和技术分享,深入探讨了NoSQL数据库技术的发展历程及其在实际场景中的应用。NoSQL(Not Only SQL...

    mongodb.zip

    MongoDB是一款开源、分布式、高性能的NoSQL数据库,以其灵活性、可扩展性和高可用性而闻名。"mongodb.zip"这个压缩包文件包含了最新正式版的...使用这个压缩包,用户可以立即开始体验MongoDB的强大功能和灵活性。

    MongoDB的安装文件,补丁以及可视化工具

    总之,这个压缩包提供了MongoDB的完整安装体验,包括必要的文件和工具,让你能够轻松安装、更新和管理MongoDB实例。无论你是初学者还是经验丰富的开发人员,这都将是一个非常有价值的资源。确保定期检查更新和补丁,...

    MongoDB在京东的使用

    总结,MongoDB在京东的使用充分体现了其作为现代NoSQL数据库的优势,不仅能满足电商平台的高并发、大数据需求,还能提供灵活的数据模型和强大的数据分析能力,助力京东提升用户体验和服务质量。通过不断优化和创新,...

    mongodb初体验

    MongoDB初体验:深入理解NoSQL数据库的魅力 MongoDB是一种流行的开源、分布式文档数据库,它属于NoSQL数据库的一种。在当今大数据和云计算的时代背景下,MongoDB因其灵活性、高性能和易于扩展性而备受青睐。本文将...

    科技行业全球SaaS云计算产业系列报告38:MongoDB,全球NoSQL数据库引领者.rar

    此外,MongoDB Atlas,由MongoDB公司提供的完全托管的云数据库服务,为开发者提供了即开即用的体验,降低了运维复杂度,让企业可以专注于创新而不是基础设施。 MongoDB在多个行业中都有广泛应用,包括物联网、电子...

    nosql 入门教程

    第2章 NoSQL上手初体验 17 2.1 第一印象——两个简单的例子 17 2.1.1 简单的位置偏好数据集 17 2.1.2 存储汽车品牌和型号数据 22 2.2 使用多种语言 30 2.2.1 MongoDB驱动 30 2.2.2 初识Thrift 33 2.3 小结 ...

Global site tag (gtag.js) - Google Analytics