1. 程式人生 > >mongodb 關閉連線的注意細節

mongodb 關閉連線的注意細節

最近一個API部署到正式環境後,總是過幾天后,就報錯誤:

java.lang.IllegalStateException: this Mongo has been closed\n\tat com.mongodb.DBTCPConnector._checkClosed(DBTCPConnector.java:95)\n\tat com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:233)\n\tat com.mongodb.DBTCPConnector.call(DBTCPConnector.java:216)\n\tat com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:288
)\n\tat com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:273)\n\tat com.mongodb.DBCursor._check(DBCursor.java:368)\n\tat com.mongodb.DBCursor._hasNext(DBCursor.java:459)\n\tat com.mongodb.DBCursor.hasNext(DBCursor.java:484)\n\tat

一開始我以為是mongodb掛了,可是其他介面訪問的很好啊!之前的解決辦法是重啟伺服器就好了。
可是今天又報錯了,還是這個錯,還是那個API。
看了網上的一個說法:

連續執行2次不同(相同不會)的操作就會爆這樣的錯誤。。。例如:

DBCollection collection= mongo.mongodb("ServerData","Users");

mongo.updata(collection,"id", id,
"state", state, 1);


mongo.insert(collection, ProductKeyWordList, ProductList);//這句就會報錯。。。。

解決方法。。。。重新初始化一次。。。。。

關閉的時候要這樣關閉。。。。


mongo = new Mongo("localhost", 27017
); mongo.close(); mongo=null;//一定要寫這句話,不然系統不會回收,只是關閉了,連線存在。

主要是看到最後一句,再回過頭看看我自己的程式碼,有這麼一句話:

private static DBCollection sharehdResearch = GGMongoOperator.getGGBusinessCollection("t_f10_sharehd_research_01");

其中GGMongoOperator.getGGBusinessCollection()方法是我公司自己封裝的方法。
裡面其實就是mongodb連線資料庫的那兩步。

1、獲取mongo物件
2、通過mongo物件與資料庫建立連線

雖然我在方法裡面關閉掉遊標,但是根據網上的說法,由於我宣告的是static變數,所以連線是依然存在的。
除非我手動mongo = null,或者不再宣告為private static 變數。
這裡由於建立資料庫的連線被公司封裝起來啦!所以這裡建議不要宣告private static 變數
直接放到相應的方法裡面,讓其隨著方法的銷燬,一起銷燬掉。

我一般選擇放到相應的方法裡面!讓其隨著方法呼叫的結束,而銷燬掉。