背景:与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提供了一系列功能,旨在提升MongoDB的使用体验: 1. **图形化用户界面(GUI)**:NoSQLBooster提供了一个直观的GUI,允许用户通过简单的拖放操作和清晰的布局来执行查询、插入、更新和删除操作,极大地...
压缩包子文件的文件名称"nosqlbooster4mongo-5.0.0.dmg"表明这是NosqlBooster 4 MongoDB的5.0.0版本的安装文件,后缀".dmg"是Mac OS特有的磁盘映像格式,用于存放应用程序和相关文件。用户只需双击该文件,按照提示...
4. **MongoDB应用领域** - **Web应用**:快速响应动态数据需求,适合内容管理系统、电子商务平台等。 - **大数据分析**:支持水平扩展,适用于处理海量非结构化数据。 - **实时应用**:低延迟读写,适用于实时...
在安全方面,NosqlBooster4mongo支持SSL连接,加强了与MongoDB服务器之间的通信加密,确保敏感数据在传输过程中不被窃取。同时,该工具也支持MongoDB身份验证机制,如SCRAM-SHA-1和x509,增强了数据库访问的安全性。...
作为一个非关系型数据库(NoSQL),MongoDB不使用传统的表和列结构,而是使用JSON格式的文档来存储数据,这使得它非常适合处理半结构化和结构多变的数据。 在"mongodb的小例子"中,我们可以预期这个压缩包包含了...
2. **MongoDB**:MongoDB是一个流行的开源NoSQL数据库系统,它使用JSON-like文档格式存储数据,具有高性能、高可用性和可扩展性。MongoDB支持动态模式,易于快速开发,适合处理大量半结构化或非结构化数据。 3. **...
在处理大量数据时,尤其是对于那些适合文档型数据结构的应用场景,MongoDB提供了一个高效的数据存储解决方案。然而,尽管MongoDB的命令行界面(CLI)功能强大,但在复杂的数据库管理和开发过程中,可视化工具的使用...
通过`laravel-mongodb-master`这个压缩包,你可以找到更多示例和代码实现,以便更好地理解和应用MongoDB与Laravel的结合。 总之,Laravel开发-mongodb MongoDB 数据库驱动让我们能够在Laravel项目中无缝地使用...
MongoDB作为一个高性能、高可用性、以及易于扩展的开源NoSQL数据库,被广泛应用于需要处理大量数据的场景中。随着业务的发展,单一数据中心往往难以满足地理分布、数据可用性和合规性等需求。这时,多数据中心部署...
- **集成Akamai技术**:利用Akamai领先的CDN技术、云压力测试工具、用户体验监控系统以及应用性能管理工具,帮助企业持续优化应用程序性能,提升用户体验,增强市场竞争力。 ##### 3. **数据库 - MongoDB** - **...
#### NoSQL发展历程与应用实践概述 在《数据库技术沙龙PPT:NoSQL应用实践》中,演讲嘉宾杨海朝通过一系列的实际案例和技术分享,深入探讨了NoSQL数据库技术的发展历程及其在实际场景中的应用。NoSQL(Not Only SQL...
MongoDB是一款开源、分布式、高性能的NoSQL数据库,以其灵活性、可扩展性和高可用性而闻名。"mongodb.zip"这个压缩包文件包含了最新正式版的...使用这个压缩包,用户可以立即开始体验MongoDB的强大功能和灵活性。
总之,这个压缩包提供了MongoDB的完整安装体验,包括必要的文件和工具,让你能够轻松安装、更新和管理MongoDB实例。无论你是初学者还是经验丰富的开发人员,这都将是一个非常有价值的资源。确保定期检查更新和补丁,...
总结,MongoDB在京东的使用充分体现了其作为现代NoSQL数据库的优势,不仅能满足电商平台的高并发、大数据需求,还能提供灵活的数据模型和强大的数据分析能力,助力京东提升用户体验和服务质量。通过不断优化和创新,...
MongoDB初体验:深入理解NoSQL数据库的魅力 MongoDB是一种流行的开源、分布式文档数据库,它属于NoSQL数据库的一种。在当今大数据和云计算的时代背景下,MongoDB因其灵活性、高性能和易于扩展性而备受青睐。本文将...
此外,MongoDB Atlas,由MongoDB公司提供的完全托管的云数据库服务,为开发者提供了即开即用的体验,降低了运维复杂度,让企业可以专注于创新而不是基础设施。 MongoDB在多个行业中都有广泛应用,包括物联网、电子...
第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 小结 ...