三、java连接mongo数据库

系列导航

一、linux单机版mongo安装(带密码验证)

二、mongo集群搭建

三、java连接mongo数据库

四、java对mongo数据库增删改查操作

五、mongo备份篇 mongoexport、mongoimport 以及mongodump、mongorestore

    java代码如何连接数据库,我这里给一个自认为比通用的连接方式。

一、pom文件

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>


        <dependency>
            <groupId>com.hynnet</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.1.0</version>
        </dependency>

二、连接代码

package mongo;

import com.mongodb.*;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 描述: mongo的集群配置样例。
 * <p>项目名称: mongo集群</p>
 * <p>文件名称: MongoDbDao.java</p>
 * <p>创建时间: 2020-10-09 </p>
 * <p>公司信息: 中国科学院新疆理化技术研究所</p>
 * <p>版权所有:Copyright (c) 2020</p>
 *
 * @author yc
 * @version 1.0.0.1 2020-10-09 yc
 * @since 1.8
 */
@Configuration
public class MongoDbDao implements ApplicationContextAware {

    static MongoClient mongoClient = null;

    @Autowired
    private Environment env;

    //springboot容器,用来获取容器内的实例
    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }


    /**
     * 描述:mongo的构造函数(配置信息)。
     */
    @Bean
    public  MongoClient  getMongoDbDao() {

        String passwd ="";
        String userName = env.getProperty("mongo.userName");
        String database = env.getProperty("mongo.database");
        passwd   = env.getProperty("mongo.passwd");
        List<ServerAddress> dataListPort = new ArrayList<>();
        String datalist = env.getProperty("mongo.datalist");
        String[] iplist = datalist.split(",");

        for (String ipPort: iplist) {
            String[] templist = ipPort.split(":");
            String ip = templist[0];
            int port = Integer.parseInt(templist[1]);
            ServerAddress serverAddress =  new ServerAddress(ip,port);
            dataListPort.add(serverAddress);
        }



        if (mongoClient == null) {
            MongoClientOptions.Builder build = new MongoClientOptions.Builder();
            //与目标数据库能够建立的最大connection数量为50
            build.connectionsPerHost(40);
            //自动重连数据库启动
            //build.autoConnectRetry(true);
            //如果当前所有的connection都在使用中,则每个connection上可以有50个线程排队等待
            build.threadsAllowedToBlockForConnectionMultiplier(5);
            /*
             * 一个线程访问数据库的时候,在成功获取到一个可用数据库连接之前的最长等待时间为2分钟
             * 这里比较危险,如果超过maxWaitTime都没有获取到这个连接的话,该线程就会抛出Exception
             * 故这里设置的maxWaitTime应该足够大,以免由于排队线程过多造成的数据库访问失败
             */
            build.maxWaitTime(1000 * 60 * 2);
            //与数据库建立连接的timeout设置为1分钟
            build.connectTimeout(1000 * 60 * 1);

            MongoClientOptions myOptions = build.build();

            if("".equals(passwd)||passwd == null){
                //没密码连接
                try {
                    mongoClient = new MongoClient(dataListPort, myOptions);
                } catch (MongoException e) {
                    e.printStackTrace();
                }
            }else {
                //有密码
                try {
                    MongoCredential credential = MongoCredential.createCredential(userName, database, passwd.toCharArray());
                    mongoClient = new MongoClient(dataListPort, Arrays.asList(credential), myOptions);
                } catch (MongoException e) {
                    e.printStackTrace();
                }
            }
        }
        return mongoClient;
    }

    /**
     * 描述:mongo的构造函数(配置信息)。
     *
     * @param dbName         数据库名
     * @param collectionName 集合名称
     * @return MongoDatabase 数据库连接
     */
    public static MongoCollection getCollection(String dbName, String collectionName) {
        return mongoClient.getDatabase(dbName).getCollection(collectionName, BasicDBObject.class);
    }

    /**
     * 描述:mongo的构造函数(配置信息)。
     *
     * @param dbName 根据数据库名称获取连接
     * @return MongoDatabase 数据库连接
     */
    public static MongoDatabase getDb(String dbName) {
        return mongoClient.getDatabase(dbName);
    }
}

 

posted @ 2021-08-24 17:58  万笑佛  阅读(769)  评论(0编辑  收藏  举报