python - 如何管理数据库连接,尤其是在多线程的情况下

标签 python mysql multithreading python-2.7

我正在做一个在线法官。我正在使用 python 2.7 和 Mysql(因为我正在做后端部分)

我的方法:

我创建了一个主线程,它从数据库中提取提交(一次 10 个)并将它们放入队列中。然后我有多个线程从队列中获取提交,对其进行评估并将结果写回数据库。

现在我有一些疑问(我知道它们是来自不同主题的疑问,但对其中一些问题的处理方法也受到高度赞赏)。

  1. 目前,当我启动线程时,我会为它们提供它们自己的数据库连接,供它们使用。为每个线程提供一个连接是一种好习惯吗?在线程之间共享连接是否会产生问题。我该如何解决这个问题。
  2. 我的主线程使用单个连接,因为它唯一的工作是从数据库中提取提交,然后放入队列(还将它们在数据库中的状态更新为评估提交)。但有时我会收到错误消息:Lost connection to Mysql server while querying。即使我停止程序并重新启动它,我仍然会收到它。我该怎么办?我还应该只为主线程实现一个连接池吗?
  3. 另外,数据库连接是否永远保持事件状态?当它的 session 内存等耗尽时该怎么办?如何处理?

最佳答案

  1. 使用连接池。共享数据库连接并不总是坏事,但您必须小心。您可以尝试使用 SQLAlchemy 来为您管理这些:http://docs.sqlalchemy.org/en/rel_0_8/orm/session.html#unitofwork-contextual

  2. 服务器可能没有连接,您的连接可能因为使用太多资源而被终止......等等。连接池可以帮助您解决这个问题。

  3. 这一切都取决于,理论上它可以无限期地存活,但通常你会在某个地方超时。

关于python - 如何管理数据库连接,尤其是在多线程的情况下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17392223/

相关文章:

python - 在 Flask session 中保留上传数据以进行分析

php - 如何打印最多帖子的用户的用户名

MySQL:如何使用 INNER JOIN 进行转换

multithreading - 在这种特殊情况下,C++ 11的内存顺序保证是什么?

c# - 如何让线程以正确的顺序运行

c# - Dispatcher Invoke(...) 与 BeginInvoke(...) 混淆

python - 如何以 pythonic 方式选择随机字符?

python - "python setup.py install"在 Dockerfile 中不起作用,但我可以进入容器并做同样的事情......任何指针?

mysql - 使用 where 和语句在 1 列中搜索

python - Scrapy错误: Spider must return Request, BaseItem或无,得到 'dict'