mongodb 关闭连接的注意细节

最近一个API部署到正式环境后,总是过几天后,就报错误:

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

一开始我以为是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 变量 直接放到相应的方法里面,让其随着方法的销毁,一起销毁掉。

我一般选择放到相应的方法里面!让其随着方法调用的结束,而销毁掉。

经验分享 程序员 微信小程序 职场和发展