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. java处理excel-xlsx格式大文件的解决方案

    1.第一次读取7M左右的ecxel文件,使用poi 库实现,参考了下面的博文. http://www.cnblogs.com/chenfool/p/3632642.html 使用上面的方法在 下面Wo ...

  2. Ubuntu16.04装机后处理

    1.卸载软件 #卸载libreOffice sudo apt remove libreoffice-common #卸载amazon sudo apt remove unity-webapps-com ...

  3. Postman学习(压力测试)

    Postman下载安装后 下面是在网上随便抓了一个请求地址来做演示,把请求地址填入地址栏,此请求为GET请求.点击Send发送请求,请求结果将会在下方显示出来.每次的请求历史数据,会被记录下来,但是经 ...

  4. SVM面经

    原始问题与对偶问题的关系 1,目标函数对原始问题是极大化,对对偶问题则是极小化 2,原始问题目标函数中的收益系数(优化函数中变量前面的系数)是对偶问题约束不等式中的右端常数,而原始问题约束不等式中的右 ...

  5. How do I use screen on the Linux systems?

    Scope The screen utility provides a way to run a command on a Linux system, detach from it, and then ...

  6. 【转】常用算法复习及实现(C++版)

    一.霍夫曼树实现 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大 ...

  7. 【CSS】 布局之浮动float和绝对定位absolute的选择

    浮动float: 浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止. 由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样.(W3C) 绝对定位 ...

  8. CentOS6.4 安装Redis

    按照下面步骤依次执行1.检查依赖,安装依赖 [root@ecs-3c46 ~]# whereis gcc gcc: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc ...

  9. XPath语法简介

    XPath是一种在xml中查找信息的语言,具体可参考W3school XPath教程 XPath是以路径表达式来选择XML文档中的节点或节点集 === XPath节点(Node) 在 XPath 中, ...

  10. 网络协议-HTTPS

    转载:http://www.renfed.com/2017/02/03/https/ 一.解决问题 HTTPS解决的是中间人攻击 公网:域名解析--IP:所以中间站点抢答返回错误IP 局域网:路由器找 ...