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

时间:2013-06-30 16:01:54

标签: python mysql multithreading python-2.7

我正在进行在线评判。我正在使用python 2.7和Mysql(因为我正在处理后端部分)

我的方法:

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

现在我有些怀疑(我知道他们对不同主题有疑问,但对其中一些主题的处理也非常感激)。

  1. 目前,当我启动线程时,我给他们自己的数据库连接,他们使用它们。这是一个很好的做法,为每个线程提供一个连接。线程之间的连接共享是否会产生问题。我该如何解决这个问题。
  2. 我的主线程使用单个连接,因为它唯一的工作是从db提取提交然后放入队列(也将其状态更新为db to Assessing Submission)。但有时我会在查询时收到错误:Lost connection to Mysql server。即使我停止程序并重新启动它,我仍然会得到它。我该怎么办呢?我还应该只为主线程实现一个连接池吗?
  3. 数据库连接是否永远存活?当会话内存等耗尽时如何处理该怎么办?

2 个答案:

答案 0 :(得分:3)

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

  2. 服务器可能没有连接,您的连接可能已被杀死,因为它使用了太多资源..等等。连接池可以帮助您解决此问题。

  3. 这完全取决于它,它可以在理论上无限期地保持活力,但通常你会在某个地方暂停。

答案 1 :(得分:1)

  1. 如果为每个线程提供相同的连接,则线程将无法查询数据库,并且将发生争用条件。所以你需要为每个线程提供单独的连接,这确实是个好主意。使用连接池可以帮助您获得不同的连接。

  2. 连接池一定会有所帮助。

  3. 工作结束后释放连接。连接存在限制,称为连接超时。所以你需要使用一些第三方库来处理它,c3p0是一个很好的库,它可以帮助你。

  4. 请参考以下链接进行配置:

    Best configuration of c3p0