项目中使用Mongodb存储图片及文件,在后台操作中没操作一个就实例化一个Mongo对象及连接池,也没有手动关闭,到时随着访问增加连接数不断增加(通过db.serverStatus().connections查看),最后导致mongodb拒绝web服务连接,web服务器抛出异常,经过改造后讲Mongodb的初始化通过spring实例化管理并设置成单例,代码中只要得到使用基本,不用重复实例化,随着服务器关闭,mongo对象及连接池关闭,连接数正常。
根据需要将mongo的相关增删改查 创建都封装到了MongoManager和DataProcessDao中,并打包加入到项目中
创建类MongoUtil
public class MongoUtil {
private static MongoManager mongoManager;
public MongoUtil() {
if (mongoManager == null) {
mongoManager = new MongoManager();
mongoManager.getInstance();
System.out.println("初始化 Mongo");
}
}
public DataProcessDao getDataProcessDao() {
DataProcessDao dataProcessDao = new DataProcessDao();
dataProcessDao.setDb(mongoManager.getDB());
return dataProcessDao;
}
}
时间仓促,没有自己整理
然后通过spring管理MongoUtil 保证单例存在appliactionContext中 达到mongo只创建一次,并在web应用服务停止时关闭
<bean id="MongoUtil"
class="tsap.general.util.MongoUtil">
</bean>
然后在需要的业务逻辑类中将MongoUtil注入进去,使用即可
public class OperateServiceImpl implements IOperateService {
private static MongoUtil mongoUtil;
private static DataProcessDao dataProcessDao;
public MongoUtil getMongoUtil() {
return mongoUtil;
}
public void setMongoUtil(MongoUtil mongoUtil) {
this.mongoUtil = mongoUtil;
}
//业务逻辑代码
public Message deleteById(String id) {
//得到的dataProcessDao是已经通过配置文件读取参数、创建mongo实例及得到db的操作类
dataProcessDao = mongoUtil.getDataProcessDao();
//调用相关操作方法即可
dataProcessDao.removeByFileName(id);
}
通过配置文件将MongoUtil注入到业务逻辑类中即可
<bean id="OperateServiceImpl" class="tsap.fxgl.service.impl.OperateServiceImpl" >
<property name="mongoUtil">
<ref bean="MongoUtil"/>
</property>
</bean>
此时web服务只占几个连接数,切随着web应用的启动和关闭释放