2013-07-12 65 views
1

我应该重新初始化每个插入的连接吗?使用python将数据插入到mongodb中

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 
    ######################### 

我是否需要打开每次连接我写了一个记录?或者我可以让一个连接断开,假设我将每秒钟以每次10KB的速度写入数据库5次?

如果只有一个连接就够了,我应该在哪里定义保存连接的变量(clientmongo,db)?

回答

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) 
+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. 
    ... 
相关问题