1. 程式人生 > >java中mongoDB連線遇到的問題

java中mongoDB連線遇到的問題

用單例模式建立mongoDB的連線,需要每次操作完關閉連線嗎?

  1. 建立了之後,每次操作呼叫同一個例項,MongoClient又是執行緒安全的,貌似就沒有什麼問題了。但是 突然想到,這些連接獲取後,操作完不主動釋放,會不會一直被佔有?

– 於是開始找各種資料,這篇文章給出了很形象的說明,MongoDB的連線池和管理
– 原來,答案是沒有必要!
在關係型資料庫中,我們總是需要關閉使用的資料庫連線,不然大量的建立連線會導致資源的浪費甚至於資料庫宕機。

通常我們習慣於new 一個connection並且通常在finally語句中呼叫connection的close()方法將其關閉。正巧,mongoDB中當我們new一個Mongo的時候,會發現它也有一個close()方法。所以會出現這樣的情況:我們在需要DB操作的方法中new一個mongo例項,然後呼叫mongo.getDB()方法拿到對應的連線,操作完資料之後再呼叫mongo.close()方法來關閉連線。 看起來貌似是沒有什麼問題,但是如果你再研究一下mongo的API,你會發現這樣耳朵操作就相當於園丁在澆花的時候去打了一桶水,然後舀了一勺水澆一朵花,然後他把一桶水全倒了回去,重新打一桶水,再舀了一勺水澆另外一朵花。。。

說到這裡大家應該都已經明白了,其實當你new Mongo()的時候,就建立了一個連線池,getDB()只是從這個連線池中拿一個可用的連線。而連線池是不需要我們及時關閉的,我們可以在程式的生命週期中維護一個這樣的單例,至於從連線池中拿出的連線,我們需要關閉嗎?答案是NO。你會發現DB根本沒有close()之類的方法。在mongoDB中,一個連線池會維持一定數目的連線,當你需要的時候呼叫getDB()去連線池中拿到連線,而mongo會在這個DB執行完資料操作時候自動收回連線到連線池中待用。所以在mongoDB中大家不必擔心連線沒有關閉的問題,在你需要在所有操作結束或者整個程式shutdown的時候呼叫mongo的close()方法即可。

MongoDB帶安全驗證的連線如何設定MongoClientOptions

管理如何建立MongoClient 這篇文章給了詳細的介紹 MongoDB 連線 for java

由於我的需要安全驗證,我就選擇了這種

 MongoClientOptions clientOptions =   
    new MongoClientOptions.Builder()  
    .connectionsPerHost(50)  
    .maxWaitTime(2000).build();  
List<MongoCredential> lstCredentials =   
        Arrays.asList
(MongoCredential.createMongoCRCredential( "admin", "myinfo", "123456".toCharArray())); client = new MongoClient(new ServerAddress("127.0.0.1"),lstCredentials, clientOptions); client.close();

可是 執行專案,卻報出了認證錯誤,查了之後發現。。方法不對,。

 Arrays.asList(MongoCredential.createMongoCRCredential(  
            "admin", "myinfo", "123456".toCharArray()));  

改為

 Arrays.asList(MongoCredential.createCredential(  
            "admin", "myinfo", "123456".toCharArray()));  

好了就。。。