使用pymongo保持连续的mongo连接活动

ano*_*428 6 python garbage-collection database-connection mongodb pymongo

我有一个来自kafka的消费者阅读,它有连续的事件流,我经常要写一个mongo集合,我必须打开一个连续的mongo连接.我的解决方案是相当hacky我觉得是每5分钟左右重新初始化一次连接以避免网络超时.这是为了避免kafka没有事件且连接空闲的时段.

任何人都可以提出更好的方法吗?因为我很确定这是建立与mongo的连续连接的错误方法.

我正在使用pymongo客户端.

我有一个MongoAdapter类,它有辅助方法:

    from pymongo import MongoClient
    import pymongo
    import time

    class MongoAdapter:
        def __init__(self,databaseName,userid,password,host):
            self.databaseName=databaseName
            self.userid=userid
            self.password=password
            self.host=host
            self.connection=MongoClient(host=self.host,maxPoolSize=100,socketTimeoutMS=1000,connectTimeoutMS=1000)
            self.getDatabase()
        def getDatabase(self):
            try:
                if(self.connection[self.databaseName].authenticate(self.userid,self.password)):
                print "authenticated true"
                self.database=self.connection[self.databaseName]
            except pymongo.errors.OperationFailure:
                print "Error: Please check Database Name, UserId,Password"
Run Code Online (Sandbox Code Playgroud)

我按以下方式使用该类重新连接:

   adapter_reinit_threshold=300   #every 300 seconds, instantiate new mongo conn.
   adapter_config_time=time.time()
   while True
       if (time.time()-adapter_config_time) > adapter_reinit_threshold:
            adapter=MongoAdapter(config.db_name,config.db_user,config.db_password,config.db_host)   #re-connect
            adapter_config_time=time.time()   #update adapter_config_time
Run Code Online (Sandbox Code Playgroud)

我继续这样做的原因是因为我认为旧的未使用的对象(具有开放连接,将被垃圾收集并且连接关闭).虽然这种方法工作正常,但我想知道是否有更简洁的方法来实现它,以及这种方法的缺陷是什么.

小智 3

来自pymongo.mongo_client.MongoClient的文档

如果操作因网络错误而失败,则会引发 ConnectionFailure 并客户端在后台重新连接。应用程序代码应该处理此异常(识别操作失败),然后继续执行。

我认为您不需要实现自己的重新连接方法。