1

我应该在每个插入上重新初始化连接吗?

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)?

4

2 回答 2

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.
    ...
于 2013-07-14T14:34:15.450 回答
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)
于 2013-07-13T01:39:00.767 回答