代码-MongoDB 线程长连接问题

问题描述

MongoDB 线程长连接问题

我在使用MongoDB的过程当中,遇到如下问题:

我的MongoDB一直存在4个ESTABLISHED 连接,一直未释放,即使任务已经执行完了。

代码如下,其中Client只会在系统启动的时候初始化一次,当然在系统停止contextDestroyed的时候Client也调用了close
public class ExportServer extends BasicMongoServer {

public final static Logger LOG = Logger.getLogger(ExportServer.class);

public static MongoClient mongoClient;
private static DB exportDB;
private static DBCollection exportCollection;

/**
初始化MongoDB Client
*/
public static void init(String add,String username,String password) throws UnknownHostException {

ArrayList<ServerAddress> addr = new ArrayList<ServerAddress>();
for (String s : add.split(",")) {
  addr.add(new ServerAddress(s.trim()));
}
if (addr.size() > 1) {
  mongoClient = new MongoClient(addr, getOptions());
} else {
  mongoClient = new MongoClient(add, getOptions());
}
mongoClient.setReadPreference(ReadPreference.secondaryPreferred());
exportDB = mongoClient.getDB("export");
exportDB.authenticate(username, password.toCharArray());
exportCollection = exportDB.getCollection("export");

if (exportCollection.getIndexInfo().size() == 0) {
  LOG.info("adding necessary indexes on export history collection");
  BasicDBObject compoundIndex = new BasicDBObject();
  compoundIndex.put("status", 1);
  exportCollection.ensureIndex(compoundIndex);
  compoundIndex.clear();
  compoundIndex.put("key", 1);
  exportCollection.ensureIndex(compoundIndex);
  compoundIndex.clear();
  compoundIndex.put("uid", 1);
  exportCollection.ensureIndex(compoundIndex);
}

}

/**
更新document
*/
public static void update(DBObject query, DBObject update) {
exportCollection.update(query, update);
}

/**
保存docuemnt
*/
public static void save(DBObject obj) {
exportCollection.save(obj);
}
}

}

这些代码当中也没有什么特别操作,包括在应用停止的时候我也会将Client关闭

请问各位是否有任何建议或者解决思路。

谢谢。

解决方案

用netstat -nlp等,查看一下对应的进程,然后就是对应的代码多看看是否有其他分支退出了,从而没有释放连接

时间: 2024-12-20 16:40:23

代码-MongoDB 线程长连接问题的相关文章

php长连接,奏是这么简单

说到长链接大家肯定不陌生,就是复用一个链接持续不断的进行数据交互,它不像那些一夜情似的服务,需要频繁的打开和关闭链接,效率低的同时还增加了业务的复杂度.在裆下很多互联网业务场景都需要长连接的支持,比如:游戏.聊天.信息推送等等等,今天我们就一步一步来揭秘php长连接的玩法.我相信任何一项技术的实施都是因为业务场景的需要,所以这次我们还拿聊天室说事儿. 0x00 初试牛刀 记得以前用php写聊天室还是用polling的方式,毫无疑问,一提到polling,肯定会有人说long polling,没错

Comet:基于 HTTP 长连接的“服务器推”技术

很多应用譬如监控.即时通信.即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新.发送请求.本文首先介绍.比较了常用的"服务器推"方案,着重介绍了 Comet - 使用 HTTP 长连接.无须浏览器安装插件的两种"服务器推"方案:基于 AJAX 的长轮询方式;基于 iframe 及 htmlfile 的流方式.最后分析了开发 Comet 应用需要注意的一些问题,以及如何借助开源的 Comet 框架-pushlet 构建自己的"服务器推&

Java Web项目中使用Socket通信多线程、长连接的方法_java

很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接如一个硬件设备,通过tcp通信,获取设备传上来的数据,并对数据做回应. 先看一下web的监听代码: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class

PHP 长连接,奏是这么简单

说到长链接大家肯定不陌生,就是复用一个链接持续不断的进行数据交互,它不像那些一夜情似的服务,需要频繁的打开和关闭链接,效率低的同时还增加了业务的复杂度.在裆下很多互联网业务场景都需要长连接的支持,比如:游戏.聊天.信息推送等等等,今天我们就一步一步来揭秘php长连接的玩法.我相信任何一项技术的实施都是因为业务场景的需要,所以这次我们还拿聊天室说事儿. 0x00 初试牛刀 记得以前用php写聊天室还是用polling的方式,毫无疑问,一提到polling,肯定会有人说long polling,没错

http长连接和短连接

HTTP实现长连接 HTTP是无状态的 也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接.如果客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源,如JavaScript文件.图像文件.CSS文件等:当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话 HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的.

数据库中的长连接和短连接区别分析

什么是长连接? 其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态. 通常的短连接操作步骤是: 连接->数据传输->关闭连接: 而长连接通常就是: 连接->数据传输->保持连接->数据传输->保持连接->----->关闭连接: 这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,短连接在没有数据传输时直接关闭就行了 什么时候用长连接,短连接? 长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信

C#中HttpClient使用注意:预热与长连接

原文:C#中HttpClient使用注意:预热与长连接 最近在测试一个第三方API,准备集成在我们的网站应用中.API的调用使用的是.NET中的HttpClient,由于这个API会在关键业务中用到,对调用API的整体响应速度有严格要求,所以对HttpClient有了格外的关注. 开始测试的时候,只在客户端通过HttpClient用PostAsync发了一个http post请求.测试时发现,从创建HttpClient实例,到发出请求,到读取到服务器的响应数据总耗时在2s左右,而且多次测试都是这

Delphi中多进程解决datasnap支持的tcp长连接数量少的问题

对于实时采集数据的项目,应用场景比如是这样的:5000客户端,每个客户端每隔500MS要给服务器上传一次数据. 大家知道,像INDY这种阻塞型的通信控件,所能支持的TCP长连接的一般地不能超过1000的数量(如果想要维持稳定运行的话). 原因是大家都晓得的,阻塞方式会为每一个SOCKET连接创建一个新的线程为之服务,而WINDOWS单个进程理论上允许最多的线程数量是2048个, 实际当中要少得多才行. 有人说可以用WINDOWS的IOCP通信模型解决,诚然!但IOCP编程过于复杂. 有人说,可以

使django与数据库保持长连接

最近遇到一个很蛋疼的问题,写了一个后台管理系统, 由于是后台管理系统 ,所以使用频率不是很高,当django程序在闲置一段时间后,再次打开后台系统 ,就变得很慢,然后又好了.查了很多方面,从模板引擎到请求(request),再到 django配置,nginx等等,都没有查出原因.虽然也查过是不是数据库的原因,但 都因为查的不够深入,没有查出所以然. 有一次在处理权限问题时,不断地追朔源代码,由于我使用的是dbroute来控 制权限,最后定位到了这个db(具体目录:/usr/local/lib/p