java实现mongodb的数据库连接池
作者:xiaojimanman 发布时间:2023-11-23 14:23:09
标签:java,mongodb,数据库
MongoDB是介于关系数据库和非关系数据库之间的一种产品,文件的存储格式为BSON(一种JSON的扩展),这里就主要介绍Java通过使用mongo-2.7.3.jar包实现mongodb连接池,具体的java代码实现如下:
数据库连接池配置参数:
/**
*@Description: mongo连接池配置文件
*/
package cn.lulei.mongo.pool;
public class MongoConfig {
private static String userName;//用户名
private static String pwd;//密码
private static String[] host;//主机地址
private static int[] port;//端口地址
private static String dbName;//数据库名
private static int connectionsPerHost = 20;//每台主机最大连接数
private static int threadsAllowedToBlockForConnectionMultiplier = 10;//线程队列数
private static boolean authentication = false;//是否需要身份验证
public static String getUserName() {
return userName;
}
public static void setUserName(String userName) {
MongoConfig.userName = userName;
}
public static String getPwd() {
return pwd;
}
public static void setPwd(String pwd) {
MongoConfig.pwd = pwd;
}
public static String[] getHost() {
return host;
}
public static void setHost(String[] host) {
MongoConfig.host = host;
}
public static int[] getPort() {
return port;
}
public static void setPort(int[] port) {
MongoConfig.port = port;
}
public static String getDbName() {
return dbName;
}
public static void setDbName(String dbName) {
MongoConfig.dbName = dbName;
}
public static int getConnectionsPerHost() {
return connectionsPerHost;
}
public static void setConnectionsPerHost(int connectionsPerHost) {
MongoConfig.connectionsPerHost = connectionsPerHost;
}
public static int getThreadsAllowedToBlockForConnectionMultiplier() {
return threadsAllowedToBlockForConnectionMultiplier;
}
public static void setThreadsAllowedToBlockForConnectionMultiplier(
int threadsAllowedToBlockForConnectionMultiplier) {
MongoConfig.threadsAllowedToBlockForConnectionMultiplier = threadsAllowedToBlockForConnectionMultiplier;
}
public static boolean isAuthentication() {
return authentication;
}
public static void setAuthentication(boolean authentication) {
MongoConfig.authentication = authentication;
}
}
数据库连接池管理类:
/**
*@Description: mongo数据库连接池管理类
*/
package cn.lulei.mongo.pool;
import java.util.ArrayList;
import java.util.List;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import com.mongodb.MongoOptions;
import com.mongodb.ReadPreference;
import com.mongodb.ServerAddress;
public class MongoManager {
private static Mongo mongo;
private DB db;
static{
init();
}
/**
* @param dbName
* @param userName
* @param pwd
* 实例化dbName一个DB
*/
public MongoManager(String dbName, String userName, String pwd) {
if (dbName == null || "".equals(dbName)) {
throw new NumberFormatException("dbName is null");
}
db = mongo.getDB(dbName);
if(MongoConfig.isAuthentication() && !db.isAuthenticated()){
if (userName == null || "".equals(userName)) {
throw new NumberFormatException("userName is null");
}
if (pwd == null || "".equals(pwd)) {
throw new NumberFormatException("pwd is null");
}
db.authenticate(userName, pwd.toCharArray());
}
}
/**
* 使用配置参数实例化
*/
public MongoManager() {
this(MongoConfig.getDbName(), MongoConfig.getUserName(), MongoConfig.getPwd());
}
/**
* @param tableName
* @return
* @Description: 获取表tableName的链接DBCollection
*/
public DBCollection getDBCollection(String tableName) {
return db.getCollection(tableName);
}
/**
* @Description: mongo连接池初始化
*/
private static void init() {
if (MongoConfig.getHost() == null || MongoConfig.getHost().length == 0) {
throw new NumberFormatException("host is null");
}
if (MongoConfig.getPort() == null || MongoConfig.getPort().length == 0) {
throw new NumberFormatException("port is null");
}
if (MongoConfig.getHost().length != MongoConfig.getPort().length) {
throw new NumberFormatException("host's length is not equals port's length");
}
try {
//服务列表
List<ServerAddress> replicaSetSeeds = new ArrayList<ServerAddress>();
for (int i = 0; i < MongoConfig.getHost().length; i++) {
replicaSetSeeds.add(new ServerAddress(MongoConfig.getHost()[i], MongoConfig.getPort()[i]));
}
//连接池参数设置
MongoOptions options = new MongoOptions();
options.connectionsPerHost = MongoConfig.getConnectionsPerHost();
options.threadsAllowedToBlockForConnectionMultiplier = MongoConfig.getThreadsAllowedToBlockForConnectionMultiplier();
mongo = new Mongo(replicaSetSeeds, options);
//从服务器可读
mongo.setReadPreference(ReadPreference.SECONDARY);
} catch (Exception e){
e.printStackTrace();
}
}
}
下面通过一个简单的测试类,来看下如何使用这个连接池~
/**
*@Description:mongo测试
*/
package cn.lulei.mongo.test;
import cn.lulei.mongo.pool.MongoConfig;
import cn.lulei.mongo.pool.MongoManager;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] host = {"127.0.0.1"};
int[] port = {27001};
MongoConfig.setHost(host);
MongoConfig.setPort(port);
MongoConfig.setDbName("novel");
MongoManager mongoManager = new MongoManager();
mongoManager.getDBCollection("chapter");
}
}
在使用上述管理类时,只需要初始化MongoConfig类即可。对类MongoManager的实例话,既可以使用MongoConfig的配置也可以自己通过参数来设置,每次获取DBCollection 时,只需要调用getDBCollection(String tableName)方法即可。


猜你喜欢
- 通过将PDF格式转换为PDF/A格式,可保护文档布局、格式、字体、大小等不受更改,从而实现文档安全保护的目的,同时又能保证文档可读、可访问。
- C#事件标准命名规则一些开源代码的事件命名很混乱,以此文章用作本人以后工作的参考。事件的名称事件始终是指某个操作,这个操作可能正在发生,也可
- 前言今天给大家带来一个国产SM4加密解密算法的java后端解决方案,代码完整,可以直接使用,希望给大家带来帮助,尤其是做政府系统的开发人员,
- 本文实例为大家分享了Unity3d实现Flappy Bird的具体代码,供大家参考,具体内容如下一、小鸟在游戏中,小鸟并不做水平位移,而是通
- 相同:1、LinkedBlockingQueue和ArrayBlockingQueue都实现了BlockingQueue接口;2、Linke
- 一、strcmp函数适用对象char*类型字符串函数介绍strcmp函数是cstring库中的函数,包含在string.h头文件中用法str
- LeetCode -- Path Sum III分析及实现方法题目描述:You are given a binary tree in whi
- 讲完了inbound事件和outbound事件的传输流程, 这一小节剖析异常事件的传输流程传播异常事件简单的异常处理的场景@Override
- 一、抽象类1.抽象类1.1抽象类的定义在Java面向对象当中,所有的对象都是用过类进行描绘的,但是并不是所有的类都是用来描绘对象的,如果一个
- 一、题目描述题目:使用ThreadLocal管理一号和二号线程,分别存入100元,在三号线程中使用利用一号和二号的计算结果来算出账户的实际金
- java多线程的同步方法实例代码先看一个段有关银行存钱的代码:class Bank { private int su
- 本文实例讲述了Android操作存放在assets文件夹下SQLite数据库的方法。分享给大家供大家参考。具体如下:因为这次的项目需要自带数
- 熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最
- 优点1.一个调用者想创建一个对象,只要知道其名称就可以了。2.扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。3.屏蔽产品的具体实现
- 本文实例讲述了Jexcel实现按一定规则分割excel文件的方法。分享给大家供大家参考。具体如下:现有一个excel文档,需要读取它并按照一
- 在一个比较坑的需求里,一段文字右上角需要追加一个圆形红点。最右侧有个金额,红点动态随着文字移动,然后各种摆布局,一下午坑死我了。后来果断放弃
- 目录前言1. 如何让两个线程依次执行?2. 如何让两个线程按照指定的方式有序相交?3. 线程 D 在A、B、C都同步执行完毕后执行4. 三个
- Lambda表达式的心得如题,因为博主也是最近才接触到Lambda表达式的(PS 在这里汗颜一会)。我并不会讲解它的原理,诚然任何一件事物如
- 实例如下:import java.util.ArrayList;import java.util.HashSet;import java.u
- Spring Boot除了可以打可执行jar包外,也支持传统的war包。本文介绍如何使用Spring Boot构建传统war包。Spring