MongoDB设置连接池操作百万级以上数据
开发环境
spring 4.3.7 + springBoot 1.5.2 + dubbo 2.6.5 + mongoDB 4.0.0
连接池配置
mongo-pool.properties
spring.data.mongodb.address=127.0.0.1:,127.0.0.1:,127.0.0.1:
spring.data.mongodb.replica-set=mySet
spring.data.mongodb.database=test
spring.data.mongodb.username=test
spring.data.mongodb.password=test # Configure spring.data.mongodbDB Pool
spring.data.mongodb.min-connections-per-host=
spring.data.mongodb.max-connections-per-host=
spring.data.mongodb.threads-allowed-to-block-for-connection-multiplier=
spring.data.mongodb.server-selection-timeout=
spring.data.mongodb.max-wait-time=
spring.data.mongodb.max-connection-idel-time=
spring.data.mongodb.max-connection-life-time=
spring.data.mongodb.connect-timeout=
spring.data.mongodb.socket-timeout=
spring.data.mongodb.socket-keep-alive=false
spring.data.mongodb.ssl-enabled=false
spring.data.mongodb.ssl-invalid-host-name-allowed=false
spring.data.mongodb.always-use-m-beans=false
spring.data.mongodb.heartbeat-socket-timeout=
spring.data.mongodb.heartbeat-connect-timeout=
spring.data.mongodb.min-heartbeat-frequency=
spring.data.mongodb.heartbeat-frequency=
spring.data.mongodb.local-threshold=
spring.data.mongodb.authentication-database=admin
MongoSettingsProperties
import java.util.List; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component; @Data
@Component
@PropertySource(value = "classpath:mongo-pool.properties")
@ConfigurationProperties(prefix = "spring.data.mongodb")
public class MongoSettingsProperties { private List<String> address;
private String replicaSet;
private String database;
private String username;
private String password;
private Integer minConnectionsPerHost = ;
private Integer maxConnectionsPerHost = ;
private Integer threadsAllowedToBlockForConnectionMultiplier = ;
private Integer serverSelectionTimeout = ;
private Integer maxWaitTime = ;
private Integer maxConnectionIdleTime = ;
private Integer maxConnectionLifeTime = ;
private Integer connectTimeout = ;
private Integer socketTimeout = ;
private Boolean socketKeepAlive = false;
private Boolean sslEnabled = false;
private Boolean sslInvalidHostNameAllowed = false;
private Boolean alwaysUseMBeans = false;
private Integer heartbeatConnectTimeout = ;
private Integer heartbeatSocketTimeout = ;
private Integer minHeartbeatFrequency = ;
private Integer heartbeatFrequency = ;
private Integer localThreshold = ;
private String authenticationDatabase; }
MongoConfig
import java.util.ArrayList;
import java.util.List; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory; import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress; @Configuration
public class MongoConfig {
// 覆盖默认的MongoDbFactory
@Bean
MongoDbFactory mongoDbFactory(MongoSettingsProperties mongoSettingsProperties) {
// 客户端配置(连接数、副本集群验证)
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
builder.connectionsPerHost(mongoSettingsProperties.getMaxConnectionsPerHost());
builder.minConnectionsPerHost(mongoSettingsProperties.getMinConnectionsPerHost());
if (mongoSettingsProperties.getReplicaSet() != null) {
builder.requiredReplicaSetName(mongoSettingsProperties.getReplicaSet());
}
builder.threadsAllowedToBlockForConnectionMultiplier(
mongoSettingsProperties.getThreadsAllowedToBlockForConnectionMultiplier());
builder.serverSelectionTimeout(mongoSettingsProperties.getServerSelectionTimeout());
builder.maxWaitTime(mongoSettingsProperties.getMaxWaitTime());
builder.maxConnectionIdleTime(mongoSettingsProperties.getMaxConnectionIdleTime());
builder.maxConnectionLifeTime(mongoSettingsProperties.getMaxConnectionLifeTime());
builder.connectTimeout(mongoSettingsProperties.getConnectTimeout());
builder.socketTimeout(mongoSettingsProperties.getSocketTimeout());
builder.sslEnabled(mongoSettingsProperties.getSslEnabled());
builder.sslInvalidHostNameAllowed(mongoSettingsProperties.getSslInvalidHostNameAllowed());
builder.alwaysUseMBeans(mongoSettingsProperties.getAlwaysUseMBeans());
builder.heartbeatFrequency(mongoSettingsProperties.getHeartbeatFrequency());
builder.minHeartbeatFrequency(mongoSettingsProperties.getMinHeartbeatFrequency());
builder.heartbeatConnectTimeout(mongoSettingsProperties.getHeartbeatConnectTimeout());
builder.heartbeatSocketTimeout(mongoSettingsProperties.getHeartbeatSocketTimeout());
builder.localThreshold(mongoSettingsProperties.getLocalThreshold()); MongoClientOptions mongoClientOptions = builder.build(); // MongoDB地址列表
List<ServerAddress> serverAddresses = new ArrayList<>();
for (String address : mongoSettingsProperties.getAddress()) {
String[] hostAndPort = address.split(":");
String host = hostAndPort[];
Integer port = Integer.parseInt(hostAndPort[]);
ServerAddress serverAddress = new ServerAddress(host, port);
serverAddresses.add(serverAddress);
}
System.out.println("serverAddresses:" + serverAddresses.toString()); // 连接认证
List<MongoCredential> mongoCredentialList = new ArrayList<>();
if (mongoSettingsProperties.getUsername() != null) {
mongoCredentialList.add(MongoCredential.createScramSha1Credential(
mongoSettingsProperties.getUsername(),
mongoSettingsProperties.getAuthenticationDatabase() != null ? mongoSettingsProperties
.getAuthenticationDatabase() : mongoSettingsProperties.getDatabase(),
mongoSettingsProperties.getPassword().toCharArray()));
}
System.out.println("mongoCredentialList:" + mongoCredentialList.toString()); // 创建客户端和Factory
MongoClient mongoClient = new MongoClient(serverAddresses,mongoCredentialList, mongoClientOptions);
MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient,mongoSettingsProperties.getDatabase()); return mongoDbFactory;
}
}
查询百万数据
第一种:
DBObject query = new BasicDBObject(); //setup the query criteria 设置查询条件
query.put("method", method);
query.put("ctime", (new BasicDBObject("$gte", bTime)).append("$lt", eTime)); logger.debug("query: {}", query); DBObject fields = new BasicDBObject(); //only get the needed fields. 设置需要获取哪些域
fields.put("_id", );
fields.put("uId", );
fields.put("ctime", ); DBCursor dbCursor = mongoTemplate.getCollection("collectionName").find(query, fields); while (dbCursor.hasNext()){
DBObject object = dbCursor.next();
logger.debug("object: {}", object);
//do something.
}
第二种:
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(orderId));
mongoTemplate.find(query, this.getEntityClass(), collectionName);
对于数据量巨大的情况下,第二种方法使用mongoTemplate.find()方法返回一个列表,如果不分页的话恐怕比较麻烦。第一种方法,使用游标逐个获取数据,同时可以指定只获取哪些域,而不是全部获取回来。
记录:
插入40万 耗时大约10秒 查询70万总数 耗时3毫秒
MongoDB设置连接池操作百万级以上数据的更多相关文章
- java操作mongodb(连接池)(转)
原文链接: java操作mongodb(连接池) Mongo的实例其实就是一个数据库连接池,这个连接池里默认有10个链接.我们没有必要重新实现这个链接池,但是我们可以更改这个连接池的配置.因为Mong ...
- .Net连接字符串设置连接池大小显著提高数据库速度
在访问mysql数据库时,如果在连接字符串中设置使用连接池,同时设置连接池大小,经测试,可以显著提高访问数据库时的速度. 连接字符串: connectionStrings> <add ...
- 在Spark中通过Scala + Mongodb实现连接池
How to implement connection pool in spark https://github.com/YulinGUO/BigDataTips/blob/master/spark/ ...
- 关于处理百万级大批量数据的mysql运行几个重要点
处理大批量百万级的数据几点重要知识点: 一:设置php运行的内存配置 ini_set("memory_limit","1200M"); 在php.ini中有如下 ...
- Golang 连接 MongoDB使用连接池
可以免费试用 MongoDB ,500MB 平时做测试没有问题啦,连接数据库可能因为网络有点慢,但是我们是测试啊,不在乎这点吧~ 这是怎么申请试用版的博客,感谢这位大佬.注册好用起来很方便~ 传送门 ...
- redis的连接方法|连接池|操作
1.先看下redis的连接 import redis # 连接服务端 r = redis.Redis(host="127.0.0.1",port=6379) #获取所有的key值 ...
- redis连接池操作
/** * @类描述 redis 工具 * @功能名 POJO * @author zxf * @date 2014年11月25日 */public final class RedisUtil { p ...
- 一种利用ADO连接池操作MySQL的解决方案(VC++)
VC++连接MySQL数据库 常用的方式有三种:ADO.mysql++,mysql API ; 本文只讲述ADO的连接方式. 为什么要使用连接池? 对于简单的数据库应用,完全可以先创建一个常连接(此连 ...
- Python3 多线程(连接池)操作MySQL插入数据
1.主要模块DBUtils : 允许在多线程应用和数据库之间连接的模块套件Threading : 提供多线程功能 2.创建连接池PooledDB 基本参数: mincached : 最少的空闲连接数, ...
随机推荐
- Java笔记Spring(五)
C:\apache-tomcat-8.0.36\bin\catalina.bat run [2018-05-23 02:30:31,657] Artifact demo-springmvc:war e ...
- CSS ——padding
css样式中使用padding(内边距)会将盒子撑开? 解决办法:在样式中添加box-sizing:border-box;
- DLC 基本定律与规则
字母数字码 :除了数字以外,数字系统还需要处理数字以外的符号,如标点符号,控制命令等 最常见的是ASCII ASCII码是7位二进制码有128种组合,表示128个符号例如 二进制表示 十六进制表示 十 ...
- 二、Python-运算符、控制及循环语句
一.运算符 算数运算符 +:加 -:减 *:乘 /:除 ~:取反 %:求余数(只返回余数) //:取整数(只返回整数部分) **:幂,返回x的y次方 赋值运算符:= 比较运算符:<小于.< ...
- (6.2)vim文本编辑器
vi / vim是Unix / Linux上最常用的文本编辑器而且功能非常强大. vim文本编辑器只有命令,没有菜单.
- .Net导出pdf文件,C#实现pdf导出 转载 http://www.cnblogs.com/hmYao/p/5842958.html
导出pdf文件. 在编码前需要在网上下载个itextsharp.dll,此程序集是必备的.楼主下载的是5.0版本,之前下了个5.4的似乎不好用. 下载之后直接添加引用. <%@ Page Lan ...
- django后台admin csv 格式表格导出
1.在app下新建一个.py文件 此例commen.py commen.py (内容)(具体怎么导出的也不知道这么写就对了) import csv from django.http import H ...
- Django 2.0 新款URL配置详解
Django2.0发布后,很多人都拥抱变化,加入了2的行列.但是和1.11相比,2.0在url的使用方面发生了很大的变化,下面介绍一下: 一.实例 先看一个例子: from django.urls i ...
- MTK6261之Catcher工具的Database Path
在Catcher使用使用的时候我们常用要选择Database Path 设置数据库的路径,编译自动生成的文件: 设置路径选项: (一般是在对应工程文件的路径 \tst\database_classb) ...
- Nginx之 try_files 指令
location / { try_files $uri $uri/ /index.php; } 当用户请求 http://localhost/example 时,这里的 $uri 就是 /exampl ...