mongodb使用实践---mongodb+mongo-java-driver+morphia
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的更多相关文章
- mongodb 最佳实践
MongoDB功能预览:http://pan.baidu.com/s/1k2UfW MongoDB在赶集网的应用:http://pan.baidu.com/s/1bngxgLp MongoDB在京东的 ...
- MongoDB Java Driver操作指南
MongoDB为Java提供了非常丰富的API操作,相比关系型数据库,这种NoSQL本身的数据也有点面向对象的意思,所以对于Java来说,Mongo的数据结构更加友好. MongoDB在今年做了一次重 ...
- Mongodb Java Driver 参数配置解析
要正确使用Mongodb Java Driver,MongoClientOptions参数配置对数据库访问的并发性能影响极大. connectionsPerHost:与目标数据库能够建立的最大conn ...
- MongoDB入门实践
MongoDB入门实践 简单介绍MongoDB,包括MongoDB的使用场景.和MySQL的对比.安装部署.Java客户端访问及总结 MongoDB? 我们遵循需求驱动技术的原则,通过一个场景来引入M ...
- MongoDB最佳实践中文手册
背景:查阅了一下MongoDB的相关文档,发现中文文档还是比较少的,工作中需要用到MongoDB,而这本<MongoDB最佳实践>是很好的选择,所以就把这本手册翻译了一下,其中生涩的专业用 ...
- C#MongoDB使用实践
9.5更新:更方便的启动命令 1)在D:\MongoDB中新建mongo.config文件,内容为 #启动mongod:mongod.exe --bind_ip 127.0.0.1 --logpath ...
- mongodb篇二:mongodb克隆远程数据库,去重查询的命令及对应java语句
http://blog.csdn.net/qkxh320/article/details/16115671 1.首先操作mongodb最基本命令:: show databases; ...
- nodejs实践-MongoDB
nodejs实践-MongoDB laiqun@msn.cn Contents 1. 特点: 2. 开始使用 3. 使用Mongoose操作MongoDB 4. 在express中使用,组织数据库相关 ...
- Spring Boot开发MongoDB应用实践
本文继续上一篇定时任务中提到的邮件服务,简单讲解Spring Boot中如何使用MongoDB进行应用开发. 上文中提到的这个简易邮件系统大致设计思路如下: 1.发送邮件支持同步和异步发送两种 2.邮 ...
随机推荐
- PL/SQL那点事-->修改Oracle数据库里面的字段长度
在开发过程中,遇到有个问题:在Oracle数据库中,利用PL/SQL数据库开发工具来开发,某一字段的长度不能满足需求时候,采用下面的语法就行修改 alter table 表名 modify 字段名 长 ...
- 安装php,nginx 带debug
gdb安装包 在CentOS6.4下使用gdb进行调试的时候, 使用bt(breaktrace)命令时,会弹出如下的提示: 头一天提示: Missing separate debuginfos, ...
- C#-★结构体★
结构体: 结构体类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型. 结构体在几个方面不同于类:结构体为值类型而不是 ...
- 欧拉筛(线性筛) & 洛谷 P3383 【模板】线性筛素数
嗯.... 埃氏筛和欧拉筛的思想都是相似的: 如果一个数是素数,那么它的所有倍数都不是素数.... 这里主要介绍一下欧拉筛的思路:(欧拉筛的复杂度大约在O(n)左右... 定义一个prime数组,这个 ...
- 基础篇:6.7)形位公差-检测方法Measurement
本章目的:了解行为公差的检测方法,简单评估公司和制作方的检测能力. 1.形位公差检测规定 形状和位置公差检测规定GB/T 1958 -2004 2.形位公差的种类 3.形位公差的测量仪器 人工测量仪器 ...
- js对函数参数的封装
对函数参数的封装 一个原始函数有n个参数,用wrap对函数进行封装,生成一个新的函数,当给它传入参数数量为n的时候,将执行原始函数,否则不执行 //函数封装 function wrap(func){ ...
- vue中nextTick的使用(转载)
转载自:https://www.cnblogs.com/chaoyuehedy/p/8985425.html 简介 vue是非常流行的框架,他结合了angular和react的优点,从而形成了一个轻量 ...
- python3 md5
参考: https://docs.python.org/3/library/hashlib.html?highlight=hashlib#credits https://blog.csdn.net/w ...
- python入门练习之如何连接数据库
!/usr/bin/python -- coding: UTF-8 -- author = 'luke' from sqlalchemy import create_engine from sqlal ...
- gps数据上传防止android系统休眠
最近在做关于android手机端gps定时定位的功能,需要每隔几秒钟将gps定位获取的经纬度上传至后台,但是发现某些手机在屏幕黑屏,进入休眠状态后,后台就没有收到定位信息了,后来通过网上查找资料,发现 ...