【发布时间】:2015-10-12 20:45:25
【问题描述】:
我有一个从 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
我这样做的原因是因为我认为旧的未使用对象(打开连接,将被垃圾收集并关闭连接)。虽然这种方法效果很好,但我想知道是否有更简洁的方法来实现,以及这种方法可能存在哪些缺陷。
【问题讨论】:
标签: python mongodb garbage-collection database-connection pymongo