MySQLdb 最佳实践 [关闭]
Posted
技术标签:
【中文标题】MySQLdb 最佳实践 [关闭]【英文标题】:MySQLdb Best Practices [closed] 【发布时间】:2011-10-11 02:50:30 【问题描述】:我目前正在开发一个 Python 脚本,它使用从 mysql 数据库中提取的一些数据来做一些事情。为了访问这些数据,我使用了模块MySQLdb。
该模块遵循PEP 249, the Python DB API 中规定的指导方针,包括创建一个连接对象和一个用于遍历信息的后续游标对象。
目前,在我的项目中,每当我需要执行 MySQL 读/写块时,我都会创建一个连接对象,然后在完成后关闭它。但是,我可以轻松地传递连接对象以避免这些重复的打开/关闭。
我的问题是:考虑到安全性、资源管理等,open; read/write; close; repeat for the next read/write;
方法是否比open; read/write; pass connection on for the next read/write;
方法更好?
编辑:更多上下文。这个特定的 Python 脚本是高度多线程的。复杂的进程/线程环境是否会影响哪种方法更合适?
【问题讨论】:
【参考方案1】:使用数据库连接的多线程应用程序可能应该使用某种连接池。在这个方案中,您有一个预定义的连接数量,所有连接都在某种队列中进行管理。当一个线程需要运行一个事务时,它会从池中获取一个连接。如果池当前处于空闲状态,则将为线程创建一个新连接;如果它很忙,它将使线程等待,直到另一个线程释放连接。当线程完成连接时,它会将连接返回到池中,然后将其交给另一个线程,或者如果没有线程在等待连接,则关闭它。
这种逻辑可能有几十种实现,但我强烈推荐 SQLAlchemy,而且不仅仅是连接管理(尽管您不必使用它做更多的事情)
【讨论】:
【参考方案2】:按照我的想法,最好只在需要时保持连接对象打开。有时继续实例化新连接可能很麻烦,但一般来说这是更好的做法。
【讨论】:
为了避免这个简单的“你有什么意见?”问题,你有统计数据/事实/经验来支持吗?谢谢! 说实话,除了您当前在完成后关闭连接的方法稍微更好的资源管理这一事实之外,这并不是一个真正的“事实”问题。始终打开连接意味着即使不需要该资源也正在使用该资源。但这真的不会有太大的不同,这更像是一个很好的练习题。【参考方案3】:作为最佳实践之一,我建议在 MySQLdb 上使用 OurSQL。
如果我是你,我会在程序执行期间始终保持连接打开,仅在程序结束时关闭它。不好的部分是你的连接池中的连接少了一个,好的部分是它为你节省了很多样板文件。
【讨论】:
这几乎可以归结为。更多样板文件或不必要的资源使用。 另外,建立新连接总是比在现有连接中查询要慢,所以如果您的应用频繁查询,不断重新连接可能会显着减慢速度。另外,请注意服务器的 max_connection 限制。以上是关于MySQLdb 最佳实践 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章