mongoDB应用场景

330 阅读1分钟

是什么?

磁盘数据库,非内存数据库,即数据存储在磁盘。

为什么要使用?

为什么不使用关系数据库mysql/oracle?关系数据库太重了,建立和释放连接太耗时。

为什么不使用内存数据库memcache?因为mongodb适合存储不重要但是占用空间比较大的数据,mongodb的数据存储在磁盘,所以适合存储的数据肯定比内存数据库要大。

工作使用

各种操作日志


代码

/**
 * @author 
 */
@SuppressWarnings("serial")
public class BaseAction extends ActionSupport {
	private static Log log = LogFactory.getLog(BaseAction.class);
	
	protected static NosqlDao nosqlDao = new MongoDao();

	protected void addMerchantLog(String content, String moduleName) {
		try {
			MerchantLog merchantLog = new MerchantLog();
			merchantLog.setIp(getIpAddr());
			merchantLog.setLogDate(new Date());
			merchantLog.setModuleName(moduleName);
			merchantLog.setUri(getHttpRequest().getRequestURI());
			MerchantUser merchantUser = (MerchantUser) this.getSessionAttribute("merchantUser");
			if(null!=merchantUser) {
				merchantLog.setMerchantId(merchantUser.getMerchantId());
				merchantLog.setUserId(merchantUser.getId());
				merchantLog.setUserName(merchantUser.getName());
			}
			merchantLog.setContent(content);
			nosqlDao.add(merchantLog); //写数据
		} catch (Exception e) {
			log.error(e);
		}
	}

非重要用户信息

在线用户数量等,总后台监控在线用户登录数量。


代码

package com.gzh.xxx.ms.comm;

import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

import com.gzh.dpp.commons.nosql.mongodb.MongoDao;
import com.gzh.dpp.domain.system.admin.SysUserStatus;

public class OnlineUserStatusListener implements HttpSessionBindingListener {
	private static MongoDao mongo = new MongoDao();
	
	private SysUserStatus sysUserStatus;
	public OnlineUserStatusListener(SysUserStatus sysUserStatus){
		this.sysUserStatus = sysUserStatus;
	}

	//登录次数,时间,IP,是否在线,是否异常登录
	public void valueBound(HttpSessionBindingEvent event) {
		try {
			List<SysUserStatus> list = mongo.query(SysUserStatus.class, "user_id", //读数据 sysUserStatus.getUser_id());
			if(list!=null&&list.size()>0){
				SysUserStatus user = list.get(0);
				sysUserStatus.setLogin_count(user.getLogin_count()+1);
				sysUserStatus.setIs_online(1);
				sysUserStatus.setLogin_time(new Date());
				sysUserStatus.setLogin_exception(0);
				mongo.update("user_id", sysUserStatus.getUser_id(), sysUserStatus); //更新数据
			}else{
				sysUserStatus.setLogin_count(1);
				sysUserStatus.setIs_online(1);
				sysUserStatus.setLogin_time(new Date());
				sysUserStatus.setLogin_exception(0);
				mongo.add(sysUserStatus); //写数据
			}
		} catch (Exception e) {
			System.out.println("mongodb error...");
		}
	}

	public void valueUnbound(HttpSessionBindingEvent event) {
		try {
			List<SysUserStatus> list = mongo.query(SysUserStatus.class, "user_id", sysUserStatus.getUser_id());
			if(list!=null&&list.size()>0){
				SysUserStatus user = list.get(0);
				sysUserStatus.setIs_online(0);
				sysUserStatus.setLogin_time(new Date());
				sysUserStatus.setLogin_exception(0);
				mongo.update("user_id", sysUserStatus.getUser_id(), sysUserStatus);
			}
		} catch (Exception e) {
			System.out.println("mongodb error...");
		}
	}
}

应用场景

1.大数据 //因为磁盘数据库,磁盘容量大 2.非重要数据/非实时数据 //因为磁盘数据库比内存数据库慢,所以实时性要求不高

如何使用

写数据

add(对象); //插入一条数据/记录

读数据

get(XXX.class,字段,字段的值) //读一条数据