由 Peer pymongo 重置连接

2024-03-08

我有一些文档,我必须从 mongodb 获取并将其设置到 memcache。这是代码

import memcache
from pymongo import MongoClient

db = mongo_client.job_db.JobParsedData
jobs = db.find().sort("JobId", 1)

def set_to_memcache_raw(jobs):
    print("Setting raw message to memcache")
    count = 0
    for item in jobs:
        job_id = item.get('JobId')
        job_details = item.get('JobDetails')
        if job_id.strip():
            count += 1
            memcache_obj.set(job_id, job_details, time=72000)
            if count % 1000 == 0:
                print("Inserted {} keys in memcache".format(count))
            if count >= 1000000:
                break

但是,经过一些奇数次迭代后,代码会抛出此错误 -

 Traceback (most recent call last):
  File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/pool.py", line 450, in receive_message
    self.sock, operation, request_id, self.max_message_size)
  File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/network.py", line 137, in receive_message
    header = _receive_data_on_socket(sock, 16)
  File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/network.py", line 164, in _receive_data_on_socket
    chunk = sock.recv(length)
ConnectionResetError: [Errno 104] Connection reset by peer

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "memcache-poc.py", line 56, in <module>
    elapsed = time.time() - t0
  File "memcache-poc.py", line 52, in main
    jobs = db.find(query)
  File "memcache-poc.py", line 17, in set_to_memcache_raw
    print("Setting raw message to memcache")
  File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/cursor.py", line 1114, in next
    if len(self.__data) or self._refresh():
  File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/cursor.py", line 1056, in _refresh
    self.__max_await_time_ms))
  File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/cursor.py", line 873, in __send_message
    **kwargs)
  File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/mongo_client.py", line 905, in _send_message_with_response
    exhaust)
  File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/mongo_client.py", line 916, in _reset_on_error
    return func(*args, **kwargs)
  File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/server.py", line 136, in send_message_with_response
    response_data = sock_info.receive_message(1, request_id)
  File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/pool.py", line 452, in receive_message
    self._raise_connection_failure(error)
  File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/pool.py", line 550, in _raise_connection_failure
    _raise_connection_failure(self.address, error)
  File "/home/dimension/.virtualenvs/docparser/lib/python3.5/site-packages/pymongo/pool.py", line 211, in _raise_connection_failure
    raise AutoReconnect(msg)
pymongo.errors.AutoReconnect: xxx.xxx.xxx.xxx:27017: [Errno 104] Connection reset by peer

我已经浏览过诸如

pymongo 错误 http://api.mongodb.com/python/current/api/pymongo/errors.html

mongodb-TCP 保持活动状态 https://docs.mongodb.com/manual/faq/diagnostics/#does-tcp-keepalive-time-affect-mongodb-deployments

为什么 pymongo 抛出自动重新连接 https://stackoverflow.com/questions/28809168/why-does-pymongo-throw-autoreconnect

上面的代码中没有套接字不活动的问题,因为我的 jobs 对象是一个迭代器,每次在该对象上调用 next() 时,它都会获取下一个文档(从 mongo 本身)

我在 Azure 云上安装了 mongodb,实例的 TCP 保持活动时间为 7200 秒。我通过触发这个命令得到这个数字

sysctl net.ipv4.tcp_keepalive_time
7200

在这种情况下,在 for 循环上使用 try catch 块是否有帮助


根据以下信息,该问题来自pymongoAPI文档here http://api.mongodb.com/python/current/api/pymongo/errors.html,异常需要手动处理。

exception pymongo.errors.AutoReconnect(message='', errors=None)

当与数据库的连接丢失并尝试自动重新连接时引发。

为了自动重新连接,您必须处理此异常,并认识到导致该异常的操作不一定成功。未来的操作将尝试打开与数据库的新连接(并将继续引发此异常,直到建立第一个成功的连接)。

我搜索了该问题的一些现有解决方案,请参见下文。

  1. 代码片段来自here https://gist.github.com/anthonywu/1696591#file-graceful_auto_reconnect-py优雅地处理 PyMongoAutoReconnect例外。
  2. 使用名为的中间件MongoDBProxy https://github.com/arngarden/MongoDBProxy自动处理AutoReconnect例外。

希望能帮助到你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由 Peer pymongo 重置连接 的相关文章

随机推荐

  • 如何向Android手机发送AT指令?

    我有 2 部 Android 手机通过蓝牙相互连接 并且能够使用 BluetoothChat 示例 使用输入 输出流 在它们之间进行通信 我还可以使用以下功能在这些手机之间建立蓝牙连接HandsFreeProfile通过使用以下UUID用于
  • 使用 Protobuf-net 的端点行为配置 WCF

    我有一个 WCF 服务 NET 4 它公开 4 个端点 其中一个端点配置有 protobuf net V1 0 0 280 行为扩展 然而 我注意到 protobuf net 行为会启动ALL定义的端点 包括未配置 protbuf net
  • 如何降级或安装特定版本的 Composer?

    我在正在设置的项目中收到以下错误 您正在使用 Composer 2 您的某些插件似乎与它不兼容 确保更新您的插件或报告插件问题以要求他们支持 Composer 2 本周我开始在一家新公司工作 只是想安装他们的项目 但似乎没有办法更改我在 W
  • 如何使用 selenium 验证 target="_blank" 链接?

    我们页面上的某些链接使用 target blank 在新窗口中打开 如何让 selenium 查看正确的窗口 以便我可以验证该页面是否链接到正确的页面 这是我一直在尝试的 open page click link Find us on Fa
  • 防止 Android Fragment 在设备旋转上重新创建

    问题 当我旋转设备时 应用程序中片段中包含的信息将被重新加载 由于该应用程序从互联网上获取信息 这意味着在重新收集数据时一段时间内会缺乏数据 我尝试过的 我读过很多文章和 S O 问题 它们给出了一些一般性的指导 并尝试了他们的解决方案 来
  • 动态链接域不可用

    根据文档 我的项目应该有一个动态链接域 它显示在动态链接页面的顶部 该文档有一个屏幕截图 如下所示 根据 Firebase 文档的域位置 https i stack imgur com 7P2Xd png 然而 在我的项目的动态链接页面上没
  • Java 程序无法运行并抛出有关类的错误

    所以我想运行我刚刚编译的 Start class 文件 它是我从 Start java 编译的 问题是它会抛出这个错误 java Start Exception in thread main java lang NoClassDefFoun
  • 在同步方法中使用 Task.Run() 以避免异步方法等待死锁?

    UPDATE这个问题的目的是为了得到一个简单的答案Task Run 和僵局 我非常理解不混合异步和同步的理论推理 并且我将它们牢记在心 我并不排斥从别人那里学习新东西 只要有可能 我都会尽力做到这一点 有时 一个人需要的只是技术答案 我有一
  • CFLAGS、CCFLAGS、CXXFLAGS - 这些变量到底控制什么?

    我正在使用 GNU make 编译我的 C 代码 我想了解如何使我的编译可定制 我在不同的地方读到CFLAGS CCFLAGS and CXXFLAGS用于此目的 那么我应该如何使用它们呢 如果我有额外的命令行参数给编译器 我应该将它们附加
  • 将结构写入 csv 文件

    将结构转储到提供的 csv 文件中的惯用 golang 方法是什么 我位于一个 func 中 其中我的结构作为 interface 传递 func decode and csv my response http Response my st
  • RoboGuice 3.0 NoClassDefFoundError:AnnotationDatabaseImpl

    由于某种原因 RoboBlender 不会生成注释数据库 我的 build gradle 具有以下依赖项 dependencies provided org roboguice roboblender 3 0 compile fileTre
  • 有没有一种简单的方法可以清除C中的管道

    我有一个所有子进程都使用的管道 但在子进程使用该管道与父进程通信之前 我需要清除它 以便父进程正确读取它 C 中有一个简单的函数可以做到这一点吗 清除 管道的方法是从管道中读取数据 直到缓冲区为空 这对你没有帮助 我猜测您真正的问题是父级可
  • 如何用一个值函数设置多个属性?

    给定包含多个数据元素的数据 例如对象或数组 是否可以使用单个值函数在选择上设置多个属性 例如 就像是 var data x 10 y 20 r 5 d3 select body append svg selectAll circle dat
  • 当单击网格上的任何其他单元格时,Ag Grid 会停止编辑单元格。如何防止这种情况发生?

    我有一个 Ag 网格fullRow编辑功能 当出现以下情况时 该行进入编辑模式 Edit单击按钮 使用startEditing 网格法 在编辑模式下 我显示两个按钮 Save and Cancel 我找到了抑制键盘事件 Enter Esc
  • 如何为 Windows 创建一个强大的、最小的安装程序? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想创建一个具有一些特定属性的安装程序 EXE 它应该是一个单一的exe文件 它应该是健壮的 即该技术应该可以在任何 Windows
  • Qmake 不使用 stdc++11 编译标志

    当我尝试编译我的项目时 出现以下错误 g c pipe std c 11 O2 g pipe Wall Werror format security Wp D FORTIFY SOURCE 2 fstack protector strong
  • 有没有有效的方法使用Android Studio模拟器测试华为应用商店的应用程序?

    我想知道是否有任何有效的方法可以使用Android Studio模拟器测试华为商店的应用程序 我尝试禁用 Google Play 服务 但由于某种原因 Retrofit 请求停止工作 您可以使用云端调试AppGallery Connect
  • 如何设置Hubot基本权限?

    如何设置基本用户权限 以便用户无法运行 Hubot die 或 Hubot show storage 等命令 我可以看到有一个名为 hubot auth 的脚本 但这似乎是为了在其他脚本中实现它 而不是控制现有命令 有一个小章节关于它使用
  • 如何在画布上制作自定义可编辑文本框,背景随文本一起传播?

    我没有在flutter中使用过canvas 但我认为像图像中的编辑文本框可以通过canvas来实现 背景随着文本长度而扩展 如果一行中的文本长度为 0 则没有背景 如果您有任何代码或建议可以这样做 请提供帮助 这里是代码 class Tex
  • 由 Peer pymongo 重置连接

    我有一些文档 我必须从 mongodb 获取并将其设置到 memcache 这是代码 import memcache from pymongo import MongoClient db mongo client job db JobPar