package com.lolaage.dals.dbfactory.mongodb;

import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List; import com.mongodb.*;
import org.apache.log4j.Logger; import com.lolaage.config.Configure;
import com.lolaage.config.IConfigure;
import com.lolaage.entity.newdata.TLogin;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.Morphia;
import org.mongodb.morphia.mapping.Mapper; /**
*
* @ClassName: MongoFactory
* @Description: MongoFactory
* @date 2018
*
*/
public class MongoFactory {
private static final Logger logger = Logger.getLogger(MongoFactory.class);
private static Datastore ds = null; private MongoFactory() { } /**
* 根据名称获取DB,相当于是连接
*
* @param
* @return
*/
public static Datastore getDatastore() {
if (ds == null) {
init();// 初始化
}
return ds; } /**
* 初始化连接池,设置参数。
*/
private static void init() {
IConfigure config = Configure.getInstance();
String host = config.readString("mongodb", "ip");
short port = config.readShort("mongodb", "port");
String uname = config.readString("mongodb", "uname");
String pwd = config.readString("mongodb", "pwd");
int poolSize = config.readInt("mongodb", "pool_size"); // 连接数量
int minpoolsize = config.readInt("mongodb", "min_pool_size"); // 最小连接数量
minpoolsize = minpoolsize>0 ? minpoolsize : 20;
int maxidletimems = config.readInt("mongodb", "maxidletimems"); //最大空闲时间
maxidletimems = maxidletimems>0 ? maxidletimems : 1000*10;
int maxWaitTime = config.readInt("mongodb", "maxWaitTime"); //最大等待时间
maxWaitTime = maxWaitTime>0 ? maxWaitTime : 1000*15;
int socketTimeout = config.readInt("mongodb", "socketTimeout");//连接超时时间
socketTimeout = socketTimeout>0 ? socketTimeout : 1000*15;
int connectTimeout = config.readInt("mongodb", "connectTimeout"); //超时
connectTimeout = connectTimeout>0 ? connectTimeout : 1000*15; int blockSize = config.readInt("mongodb", "block_size"); // 等待队列长度
String databaseName = config.readString("mongodb", "database_name");
Morphia morphia = new Morphia();
Mapper mapper = morphia.getMapper();
mapper.addMappedClass(TLogin.class);
mapper.createEntityCache(); // 其他参数根据实际情况进行添加
try {
//1.连接池相关选项配置
MongoClientOptions options=MongoClientOptions.builder()
.connectionsPerHost(poolSize)
.minConnectionsPerHost(minpoolsize)
.maxConnectionIdleTime(maxidletimems)
.threadsAllowedToBlockForConnectionMultiplier(blockSize)
.maxWaitTime(maxWaitTime)
.socketTimeout(socketTimeout)
.connectTimeout(connectTimeout)
.build();
//2.鉴权配置
MongoCredential credential = MongoCredential.createScramSha1Credential(uname, "admin", pwd.toCharArray());
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(credential); //3.mongodb服务器相关配置
List<ServerAddress> addresses=new ArrayList<ServerAddress>();
addresses.add(new ServerAddress(host, port)); //4.创建客户实例,获取数据库存储对象。
MongoClient mongoClient = new MongoClient(addresses,credentials, options);
morphia.mapPackage("com.lolaage");// 告诉morphia到哪个包下面去找实体类
logger.warn("获取数据库连接对象>>>>>>>>>>>>>>>>>");
ds = morphia.createDatastore(mongoClient, databaseName);// 构建Datastore对象,其中`databaseName`是数据库名称
ds.ensureIndexes();//确保索引生效
//} catch (UnknownHostException e) {
// logger.error(e.getMessage());
} catch (MongoException e) {
logger.error(e.getMessage());
}
}
}
--------------------------------------------使用样例-------------------------------------------------------
1.对象配置
@Entity
public class TLogin extends LongPKMongoEO {
private int sessionId;
private long userId; public int getSessionId() {
return sessionId;
}
public void setSessionId(int sessionId) {
this.sessionId = sessionId;
}
public long getUserId() {
return userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
}

 

public abstract class LongPKMongoEO {

   @Id
Long _id; @Transient
protected Datastore ds; public void setDs(Datastore ds) {
this.ds = ds;
} @PrePersist
void prePersist() { //自增性主键的处理 if (_id == null) {
String collName = ds.getCollection(getClass()).getName();
Query<StoredSeqence> q = ds.find(StoredSeqence.class, "_id", collName);
StoredSeqence ss = ds.findAndModify(q, ds.createUpdateOperations(StoredSeqence.class).inc("value"));
if(ss == null) {
ss = new StoredSeqence(collName);
ss.setValue(1l);
ds.save(ss);
}
_id = ss.getValue(); }
} public Long getId() {
return _id;
} }
@Entity(noClassnameStored = true)
public class StoredSeqence implements Serializable { private static final long serialVersionUID = 1L; @Id
String collName; Long value; public StoredSeqence() { } public StoredSeqence(String collName) {
this.collName = collName;
} public Long getValue() {
return value;
} public void setValue(Long value) {
this.value = value;
} public String getCollName() {
return collName;
} public void setCollName(String collName) {
this.collName = collName;
} }

2.对象存储:
Datastore datastore = MongoFactory.getDatastore();
Datastore ds = getDatastore();
ds.save(loginVO);
3.对象查询:
Datastore ds = getDatastore();
Query<TLogin> q = ds.createQuery(TLogin.class);
q.filter("userId", ((Long)userId));
TLogin login = q.get();

mongodb使用实践---mongodb+mongo-java-driver+morphia的更多相关文章

  1. mongodb 最佳实践

    MongoDB功能预览:http://pan.baidu.com/s/1k2UfW MongoDB在赶集网的应用:http://pan.baidu.com/s/1bngxgLp MongoDB在京东的 ...

  2. MongoDB Java Driver操作指南

    MongoDB为Java提供了非常丰富的API操作,相比关系型数据库,这种NoSQL本身的数据也有点面向对象的意思,所以对于Java来说,Mongo的数据结构更加友好. MongoDB在今年做了一次重 ...

  3. Mongodb Java Driver 参数配置解析

    要正确使用Mongodb Java Driver,MongoClientOptions参数配置对数据库访问的并发性能影响极大. connectionsPerHost:与目标数据库能够建立的最大conn ...

  4. MongoDB入门实践

    MongoDB入门实践 简单介绍MongoDB,包括MongoDB的使用场景.和MySQL的对比.安装部署.Java客户端访问及总结 MongoDB? 我们遵循需求驱动技术的原则,通过一个场景来引入M ...

  5. MongoDB最佳实践中文手册

    背景:查阅了一下MongoDB的相关文档,发现中文文档还是比较少的,工作中需要用到MongoDB,而这本<MongoDB最佳实践>是很好的选择,所以就把这本手册翻译了一下,其中生涩的专业用 ...

  6. C#MongoDB使用实践

    9.5更新:更方便的启动命令 1)在D:\MongoDB中新建mongo.config文件,内容为 #启动mongod:mongod.exe --bind_ip 127.0.0.1 --logpath ...

  7. mongodb篇二:mongodb克隆远程数据库,去重查询的命令及对应java语句

    http://blog.csdn.net/qkxh320/article/details/16115671 1.首先操作mongodb最基本命令:: show databases;           ...

  8. nodejs实践-MongoDB

    nodejs实践-MongoDB laiqun@msn.cn Contents 1. 特点: 2. 开始使用 3. 使用Mongoose操作MongoDB 4. 在express中使用,组织数据库相关 ...

  9. Spring Boot开发MongoDB应用实践

    本文继续上一篇定时任务中提到的邮件服务,简单讲解Spring Boot中如何使用MongoDB进行应用开发. 上文中提到的这个简易邮件系统大致设计思路如下: 1.发送邮件支持同步和异步发送两种 2.邮 ...

随机推荐

  1. linux开机、重启和用户登陆注销

    关机&重启命令 基本介绍: shutdown –h now    立该进行关机 shudown -h 1 "hello, 1 分钟后会关机了" shutdown –r no ...

  2. mocha测试框架

    中文翻译文档:https://www.jianshu.com/p/9c78548caffa 阮一峰:http://www.ruanyifeng.com/blog/2015/12/a-mocha-tut ...

  3. es第四篇:Query DSL

    Query and filter context Match All Query 最简单的search请求,匹配所有文档,文档的_score值都是1,示例: get twitter/_search{  ...

  4. Angular  CLI

    简介 ng  官方命令行 Angular  CLI 自己的官方文档 https://github.com/angular/angular-cli/wiki/new 常用代码   临时代码 ng new ...

  5. oracle--块信息深入解析

    一,创建 Data Block是数据库中最小的I/O单元 01,建立一个新的表空间 查看默认表空间位置 select TABLESPACE_NAME,FILE_NAME from dba_data_f ...

  6. 远控项目(Windows Socket)

    实现内容(屏幕,鼠标,键盘实时控制) 控制端: #pragma once #ifndef keybd_H #define keybd_H #include <stdio.h> #inclu ...

  7. Python爬虫抓取某音乐网站MP3(下载歌曲、存入Sqlite)

    最近右胳膊受伤,打了石膏在家休息.为了实现之前的想法,就用左手打字.写代码,查资料完成了这个资源小爬虫.网页爬虫, 最主要的是协议分析(必须要弄清楚自己的目的),另外就是要考虑对爬取的数据归类,存储. ...

  8. selenium+JDBC实现参数自动化测试

    测试模拟环境:在www.1905.com网站中执行两个用户的登陆退出操作 需要的文件有: 1.User的实例类: public class User { private String username ...

  9. android 仿网易新闻首页框架

       实现思路很简单左侧栏目是一个一个的 Fragment 的,点击时动态替换各个 Fragment 到当前 Activity 中. 关键代码: public void loadFragment(Ma ...

  10. Zookeeper概念学习系列之paxos协议

    不多说,直接上干货! 前言 一种最终一致的算法,paxos算法. paxos算法是由大牛lamport发明的,关于paxos算法有很多趣事.比如lamport论文最初由故事描述来引入算法,以至于那班习 ...