基于java實現mongodb的數據庫連接池

jopen 9年前發布 | 19K 次閱讀 Java MongoDB

MongoDB是介于關系數據庫和非關系數據庫之間的一種產品,文件的存儲格式為BSON(一種JSON的擴展)

這里就主要介紹一樣在Java中通過使用mongo-2.7.3.jar這個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
     * @Date:2014-3-19  
     * @Author:lulei  
     * @Description: 獲取表tableName的鏈接DBCollection
     */
    public DBCollection getDBCollection(String tableName) {
        return db.getCollection(tableName);
    }

    /**
     * @Date:2014-3-19  
     * @Author:lulei  
     * @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)方法即可

出處: http://blog.csdn.net/xiaojimanman/article/details/22652239

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!