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上的常用的进程与内存优化命令

    进程 ps命令 f 以树状结构显示 u 显示详细信息 a 显示所有进程 -A 显示所有进程 -u 用户名 是显示该用户下的进程 -l 更多进程详细信息 例子1. 以树状结构显示root用户下进程的详细 ...

  2. Mongo限制规则

    文章翻译自来源:http://docs.mongodb.org/manual/reference/limits/#limit-bson-document-size 一.BSON 文档 1.BSON文档 ...

  3. 浅析PHP反序列化漏洞之PHP常见魔术方法(一)

    作为一个学习web安全的菜鸟,前段时间被人问到PHP反序列化相关的问题,以前的博客中是有这样一篇反序列化漏洞的利用文章的.但是好久过去了,好多的东西已经记得不是很清楚.所以这里尽可能写一篇详细点的文章 ...

  4. golang (2) package

    综述 golang package是基本的管理单元,package是golang最基本的分发单位和工程管理中依赖关系的体现. 每个golang源代码文件开头都拥有一个package声明,表示该gola ...

  5. opencv_python使用cv2.imread()读取中文路径报错问题(转)

    原地址:https://blog.csdn.net/liuqinshouss/article/details/78696032 1 说明 本篇中使用的opencv版本为3.3,python使用的版本为 ...

  6. http-https php文件下载

    http: function httpDownload($url, $path = '', $filename = '', $timeout = 60,$type = 0) { if ($url == ...

  7. 换个角度看Salesforce之基础配置学习笔记(一)

    1. Salesforce.com与force.com的关系: Salesforce.com is build on the force.com platform seamlessly.That is ...

  8. Linux下用tree命令列出树形图

    命令用法: tree 参数: -a 显示所有文件和目录. -A 使用ASNI绘图字符显示树状图而非以ASCII字符组合. -C 在文件和目录清单加上色彩,便于区分各种类型. -d 显示目录名称而非内容 ...

  9. DBCP连接池工具类模板

    package ${enclosing_package}; import java.io.InputStream; import java.sql.Connection; import java.sq ...

  10. Node.js Mongoose数据库连接失败 提示:Authentication failed

    mongoose.connect('mongodb://username:password@127.0.0.1:27017/qianxunkefu_db')换成mongoose.connect('mo ...