我应该在每次插入时重新初始化连接吗?
class TwitterStream:
def __init__(self, timeout=False):
while True:
dump_data()
def dump_data:
##dump my data into mongodb
##should I be doing this every time??:
client=MongoClient()
mongo=MongoClient('localhost',27017)
db=mongo.test
db.insert('some stuff':'other stuff')
##dump data and close connection
#########################
我是否需要每次打开连接 我都会写一条记录?或者我可以保持连接打开,假设我每秒写入数据库5次,每次大约10kb?
如果只有一个连接就足够了,我应该在哪里定义保存连接的变量(client
,mongo
,db
)?
答案 0 :(得分:1)
打开一个在程序期间存在的MongoClient:
client = MongoClient()
class TwitterStream:
def dump_data:
while True:
db = client.test
db.insert({'some stuff': 'other stuff'})
打开一个MongoClient意味着您只需支付一次启动费用,其连接池将最大程度地降低打开新连接的成本。
如果您担心偶尔出现网络问题,请将您的操作包装在异常块中:
try:
db.insert(...)
except pymongo.errors.ConnectionFailure:
# Handle error.
...
答案 1 :(得分:0)
打开连接通常是一项昂贵的操作,因此我建议您尽可能多地重复使用它们。
对于MongoClient,您应该可以保持连接处于打开状态并继续重复使用。但是,由于连接持续较长时间,最终您将开始遇到连接问题。建议的解决方案是将MongoClient配置为使用自动重新连接,并在重试机制中捕获AutoReconnect异常。
以下是从http://python.dzone.com/articles/save-monkey-reliably-writing获取的所述方法的示例:
while True:
time.sleep(1)
data = {
'time': datetime.datetime.utcnow(),
'oxygen': random.random()
}
# Try for five minutes to recover from a failed primary
for i in range(60):
try:
mabel_db.breaths.insert(data, safe=True)
print 'wrote'
break # Exit the retry loop
except pymongo.errors.AutoReconnect, e:
print 'Warning', e
time.sleep(5)