单例内有其他公开方法,这样设计可以吗?
package com.zqgame.activity.db;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import com.mongodb.MongoOptions;
/**
* MongoDB 连接池管理
*
* @author Kai.Zhao
* @date Sept. 16th, 2014
* @since 1.0
*/
public class MongoDB {
Logger log = LoggerFactory.getLogger(MongoDB.class);
private static Map<String, DB> dbMap;
private static Mongo mongo;
private MongoDB() {
dbMap = Collections.synchronizedMap(new HashMap<String, DB>());
}
private static MongoDB mongoDB;
public static MongoDB getInstance() {
if (mongoDB == null) {
synchronized (MongoDB.class) {
mongoDB = new MongoDB();
}
}
return mongoDB;
}
/**
* 初始化Mongo
*
* @param host 主机名
* @param port 端口
* @param poolSize 连接数量
* @param blockSize 等待队列长度
* @throws Exception
* @author Kai.Zhao
* @since 1.0
*/
public synchronized void initMongo(String host, int port, int poolSize, int blockSize) {
try {
if (mongo == null) {
mongo = new Mongo(host, port);
MongoOptions options = mongo.getMongoOptions();
options.autoConnectRetry = true;
options.connectionsPerHost = poolSize;
options.threadsAllowedToBlockForConnectionMultiplier = blockSize;
}
log.info("Init Mongo {} [{}]", host, port);
} catch (Exception e) {
log.error("Init Mongo Error", e);
}
}
/**
* 获取数据集合
*
* @param dbname 库名
* @param name 集合名
* @return
* @throws Exception
* @author Kai.Zhao
* @since 1.0
*/
public static DBCollection getCollection(String dbname, String name) throws Exception {
if (dbMap.containsKey(dbname)) {
return dbMap.get(dbname).getCollection(name);
}
DB db = mongo.getDB(dbname);
dbMap.put(dbname, db);
return db.getCollection(name);
}
}
------解决思路----------------------
同步块里还要再加个判断
if (mongoDB == null) {
synchronized (MongoDB.class) {
if (mongoDB == null) {
mongoDB = new MongoDB();
}
}
}
------解决思路----------------------
用枚举来做单例
------解决思路----------------------
+1. 经典的单例模式啊。。