mongodb 關閉連線的注意細節
阿新 • • 發佈:2018-12-24
最近一個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
變數
直接放到相應的方法裡面,讓其隨著方法的銷燬,一起銷燬掉。
我一般選擇放到相應的方法裡面!讓其隨著方法呼叫的結束,而銷燬掉。