2013-02-14 41 views
10

我们有一个包含二十多个模块的Python应用程序,其中大部分都由几个Web和控制台应用程序共享。我应该如何在多模块Python应用程序中建立和管理数据库连接?

我从来没有清楚地了解在多模块Python应用程序中建立和管理数据库连接的最佳实践。考虑这个例子:

我有一个模块为用户定义一个对象类。它有很多用于在数据库中创建/删除/更新用户的defs。 users.py模块被导入到a)基于控制台的实用程序中,2)基于web.py的web应用程序和3)持续运行的守护进程。

这三个应用程序的每一个都有不同的生命周期。守护进程可以打开连接并保持打开状态。控制台实用程序连接,确实工作,然后死亡。当然,http请求是原子的,但是web服务器是一个守护进程。

我目前正在打开,然后在Users类中的每个函数内使用关闭连接。这看起来效率最低,但它适用于所有示例。用作测试的替代方法是声明并打开整个模块的全局连接。另一个选择是在顶层应用层创建连接并在实例化类时传递引用,但这对我来说似乎是最糟糕的主意。

我知道每个应用程序架构都不一样。我只是想知道是否有最佳做法,它会是什么?

+0

看看连接池按照这个[question](http://stackoverflow.com/questions/98687/what-is-the-best-solution-for-database-connection-pooling-in-python) – Mark 2013-02-14 20:48:49

回答

9

最好的方法是当你需要做一些操作(如获取和/或更新数据)时打开连接;操纵数据;将其写回数据库一个查询(对性能非常重要),然后关闭连接。打开连接是一个相当轻的过程。

一些陷阱性能包括

  • 打开数据库时,你会不会肯定它
  • 使用需要更多的数据比你的需要(例如,让所有用户数据,并对其进行筛选选择与互动在Python中,而不是要求MySQL过滤出无用的数据)
  • 写入没有改变的值(例如更新用户配置文件的所有值,仅当他们的电子邮件已经改变时)
  • 每个字段更新服务器单独(例如,打开数据库,更新用户电子邮件,关闭数据库,打开数据库,更新用户密码,关闭数据库,打开...你明白了)

底线是打开数据库的次数并不重要,它是您运行多少个查询。如果你可以让你的代码加入相关的查询,你就赢得了这场战斗。

+0

这个正是我所寻找的,证实了我最好的猜测,并且意味着我不必“重做任何东西!感谢您的额外提示 - 我已经在做所有这些,但这是一个很好的清单。 – hikaru 2013-02-14 21:08:31

4

MySQL连接速度相对较快,所以这可能不成问题(即您应该测量)。大多数其他数据库需要更多资源来创建连接。

当你需要一个连接时创建一个新连接总是最安全的,并且是一个不错的首选。一些db库,例如SqlAlchemy,内置连接池透明地将正确地重新使用连接。

如果你决定要保持连接活着,这样就可以重新使用它,有几点需要注意:

  1. 连接是仅用于阅读更容易比您用来修改数据库数据的连接重用。

  2. 当你在一个连接上启动一个事务时,要小心在你使用它的时候没有别的东西可以使用这个连接来做别的事情。

  3. 长时间坐着的连接会变得过时并且可能从下面关闭,所以如果您要重新使用连接,则需要检查它是否仍然“活着”,例如,通过发送“选择1”并验证您获得结果。

我个人建议不要实施自己的连接池算法。当事情出错时真的很难调试。相反,选择一个数据库库为你做。

相关问题