由於業務需要,最近公司將一部分的資料轉移的MongoDB資料庫中。
在配合公司DBA 將 Mongodb資料庫部署完畢以後,開始了我們的JAVA串連MongoDB的實踐
開始前,推薦兩個串連資料庫的IDE工具
1.rockmongo-on-windows-v0.0.2 (只在Firefox瀏覽器中運行成功)
2. Robomongo (在32機 XP 系統會啟動不了)
MongoManager 函數 (實現Mongo 的單例模式)
public class MongoManager {private static final Logger LOGGER = Logger.getLogger(MongoManager.class);private static Mongo mongo = null;private MongoManager() {}public static DB getDB(String dbName) {try {if (mongo == null) {init();}} catch (Exception e) {LOGGER.error(e.getMessage(), e);}return mongo.getDB(dbName);}private static void init() {try {MongoClient client = new MongoClient(); mongo = MongoClient.connect(127.0.0.1, 27017)).getMongo(); MongoOptions options = mongo.getMongoOptions();options.socketTimeout = 20000;options.maxWaitTime = 20000;options.connectTimeout = 20000;} catch (Exception e) {LOGGER.error(e.getMessage(), e);}}
在使用的過程中 如果大量的資料插入;每次萬條資料, 千萬級的資料量 經常會報串連異常(連線逾時,找不到對應的db )
檢查發現 是由於串連不釋放引起的 ( db.serverStatus().connections; )
解決的方式:
廢棄使用 Mongo 函數 使用MongoClient 問題就解決了
附上 串連時候的 參數介紹:
如果連接線程排滿了隊列就會拋出“Out of semaphores to get db”錯誤。
maxWaitTime:最大等待串連的線程阻塞時間
connectTimeout:連線逾時的毫秒。0是預設和無限
socketTimeout:socket逾時。0是預設和無限
autoConnectRetry:這個控制是否在一個串連時,系統會自動重試