/******************************************************************************* * Copyright (c) 2013 hangum. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v2.1 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * hangum - initial API and implementation ******************************************************************************/ package com.hangum.tadpole.mongodb.core.connection; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import com.hangum.tadpole.cipher.core.manager.CipherManager; import com.hangum.tadpole.engine.query.dao.system.UserDBDAO; import com.mongodb.DB; import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.MongoClientURI; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; /** * mongo db connection * * @author hangum * */ public class MongoConnectionManager { private static final Logger logger = Logger.getLogger(MongoConnectionManager.class); private static Map<String, MongoClient > dbManager = null; private static MongoConnectionManager mongodbConnectionManager = null; static { if(mongodbConnectionManager == null) { mongodbConnectionManager = new MongoConnectionManager(); dbManager = new HashMap<String, MongoClient>(); } } private MongoConnectionManager() {} /** * * @param userDB * @return * @throws Exception */ public static DB getInstance(UserDBDAO userDB) throws MongoDBNotFoundException, Exception { DB db = null; /* * https://mongodb.github.io/casbah/guide/connecting.html */ synchronized (dbManager) { String searchKey = getKey(userDB); try { MongoClient mongoDB = dbManager.get( searchKey ); if(mongoDB == null) { MongoClientOptions clientOptions = MongoClientOptions.builder().connectionsPerHost(200).connectTimeout(5000).socketTimeout(5000).build(); List<MongoCredential> listCredential = new ArrayList<>(); if(!"".equals(userDB.getUsers())) { //$NON-NLS-1$ // pass change String passwdDecrypt = ""; try { passwdDecrypt = CipherManager.getInstance().decryption(userDB.getPasswd()); } catch(Exception e) { passwdDecrypt = userDB.getPasswd(); } MongoCredential mongocredintial = MongoCredential.createCredential(userDB.getUsers(), userDB.getDb(), passwdDecrypt.toCharArray()); listCredential.add(mongocredintial); } String strReplcaSet = userDB.getExt1(); if(strReplcaSet == null | "".equals(strReplcaSet)) { if(!listCredential.isEmpty()) { ServerAddress sa = new ServerAddress(userDB.getHost(), Integer.parseInt(userDB.getPort())); mongoDB = new MongoClient(sa, listCredential, clientOptions); } else { mongoDB = new MongoClient(new MongoClientURI(userDB.getUrl())); } } else { List<ServerAddress> listServerList = new ArrayList<ServerAddress>(); listServerList.add(new ServerAddress(userDB.getHost(), Integer.parseInt(userDB.getPort()))); String[] urls = StringUtils.split(strReplcaSet, ","); for (String ipPort : urls) { String[] strIpPort = StringUtils.split(ipPort, ":"); listServerList.add(new ServerAddress(strIpPort[0], Integer.parseInt(strIpPort[1]))); } if(!listCredential.isEmpty()) { mongoDB = new MongoClient(listServerList, listCredential, clientOptions); } else { mongoDB = new MongoClient(listServerList, clientOptions); } } // db를 map에 넣습니다. dbManager.put(searchKey, mongoDB); } db = mongoDB.getDB(userDB.getDb()); } catch(Exception e) { logger.error("mongodb connection error", e); dbManager.remove(searchKey); throw e; } } return db; } /** * map의 카를 가져옵니다. * @param userDB * @return */ private static String getKey(UserDBDAO userDB) { return userDB.getDbms_type()+userDB.getUrl()+userDB.getUsers()+userDB.getPasswd()+userDB.getDisplay_name(); } }