我有来自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"
我按以下方式使用该类重新连接:
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
我继续这样做的原因是因为我认为旧的未使用的对象(具有开放连接,将被垃圾收集并且连接关闭)。虽然这种方法运行正常,但我想知道是否有更简洁的方法可以做到这一点,以及这种方法的缺陷是什么。
答案 0 :(得分:0)
来自pymongo.mongo_client.MongoClient
的文档如果操作因网络错误而失败,则ConnectionFailure为 提出并且客户端在后台重新连接。应用代码 应该处理这个异常(认识到操作失败) 然后继续执行。
我认为您不需要实施自己的重新连接方法。