【问题标题】:Python: decryption failed or bad record mac when calling from ThreadPython:从 Thread 调用时解密失败或错误记录 mac
【发布时间】:2013-12-18 15:03:52
【问题描述】:

我在此代码片段中收到“解密失败或错误记录 mac”错误:

conn = psycopg2.connect(...)
cursor = conn.cursor()
cursor.execute("SELECT id, ip FROM schema.table;")
rows = cursor.fetchall()
cursor.close()
conn.commit()
conn.close()

这在线程的 run() 方法中被调用,在 while(True) 循环中多次调用。 我只是使用 psycopg2 驱动程序打开到我的 PostgreSQL 数据库的连接。

您知道在 Python 中将数据库连接打开到线程中有多安全吗? 我不知道是什么引发了这个错误。

【问题讨论】:

  • 循环的每次迭代都会引发异常吗?哪一行是真正提高它的那一行?
  • 你好,它是在 cursor.execute("SELECT id, ip FROM schema.table;") 提出的。它不是在每次迭代中都被抛出,它只做了几次正确的迭代,然后引发一次错误并停止执行。
  • 好的,看来我已经解决了这个问题。我创建了太多的连接,似乎我的内存不足或什么的。 conn = None 之后 conn.close() 成功了。感谢您的回复。
  • 您可以发布您的评论作为答案,甚至在一段时间后接受它。在这种情况下,人们可以从问题中看到问题已经解决。如果人们在问题或答案上点击 +1,您将获得积分(像这样)。
  • 我在尝试在 Python 中运行 Multiprocessing 和 Postgresql 时遇到了类似的问题。我注意到我在所有生成的进程中都使用了相同的连接,因此它失败了。我将引擎传递给不同的进程,然后在它们各自的进程中创建新的连接。成功了!

标签: python multithreading postgresql encryption database-connection


【解决方案1】:

好的,看来我已经解决了这个问题。我创建了太多的连接,似乎我的内存不足或什么的。 我收集了所有查询,并对一个巨大的查询执行一次 cursor.execute(...),而不是执行数百个小查询/连接。

conn = psycopg2.connect(...)
cursor = conn.cursor()
cursor.execute("SELECT id, ip FROM schema.table;")
rows = cursor.fetchall()
cursor.close()
conn.commit()
conn.close()
conn = None

【讨论】:

  • 附注:with conn as cursor: 将合并 corsor 创建、cursor.close()conn.commit() 合二为一。
【解决方案2】:

这个问题的原因可能是,有太多进程(多个)试图访问 PostGres,它无法处理。我在 BeanStalk 中使用 Django 和 PostGres。

在数据库配置中添加'OPTIONS': {'sslmode': 'disable'} 有帮助。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': ...
        'USER': ....
        'PASSWORD': ...
        'HOST': ....
        'PORT': '5432',
        'OPTIONS': {
           'sslmode': 'disable',
        }
    }
}

【讨论】:

    猜你喜欢
    • 2013-07-05
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2015-06-13
    • 2017-12-26
    相关资源
    最近更新 更多