赞
踩
最近一个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
变量
直接放到相应的方法里面,让其随着方法的销毁,一起销毁掉。
我一般选择放到相应的方法里面!让其随着方法调用的结束,而销毁掉。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。