MySQLdb最佳实践

5
我目前正在开发一个Python脚本,它可以对从MySQL数据库中提取的一些数据进行一些操作。为了访问这些数据,我使用MySQLdb模块。
该模块遵循PEP 249, Python DB API中规定的指南,涉及创建连接对象和随后的游标对象,用于迭代信息。
目前,在我的项目中,每当需要进行一块MySQL读写时,我就创建一个连接对象,然后在完成后关闭它。但是,我可以轻松地传递连接对象,以避免这些重复的打开/关闭。
我的问题是:考虑到安全性、资源管理等方面,打开;读/写;关闭;重复进行下一个读/写方法是否比打开;读/写;将连接传递给下一个读/写方法更好?
编辑:一些背景信息。这个特定的Python脚本是高度多线程的。复杂的进程/线程环境是否影响哪种方法更合适?
3个回答

1
我认为最好的方法是只在需要时保持连接对象开放。有时候反复实例化新的连接可能会很麻烦,但一般来说这是更好的做法。

1
为了避免这变成一个简单的“你有什么意见?”问题,你是否有统计数据、事实或经验来支持你的观点?谢谢! - Patrick Perini
说实话,这不是一个“事实”问题,除了你目前的在完成后关闭连接的方法稍微更好的资源管理之外。一直保持连接意味着即使不需要也在使用资源。但这并不会有太大的影响,这更多是一个良好实践的问题。 - Jon Martin

1
一个使用数据库连接的多线程应用程序应该使用某种连接池。在这个方案中,您有一定数量的连接,所有连接都在某种队列中进行管理。当一个线程需要运行一个事务时,它从池中获取一个连接。如果池当前处于空闲状态,则会为线程创建一个新连接;如果非常繁忙,则会使线程等待,直到另一个线程释放连接。当线程完成连接后,它将连接返回到池中,池将其移交给另一个线程,或者如果没有线程等待连接,则关闭连接。
这个逻辑可能有数十种实现方式,但我强烈推荐SQLAlchemy,不仅仅是因为它的连接管理(尽管您不必将其用于更多的功能)。

0
作为最佳实践之一,我建议使用OurSQL而不是MySQLdb。
如果我是你,在程序执行期间始终保持连接打开,只有在程序结束时才关闭它。坏处是你的连接池中少了一个连接,好处是它可以节省大量样板代码。

这基本上就是它的本质。更多的样板代码,或不必要的资源使用。 - Jon Martin
另外,建立新连接总是比在现有连接中查询慢,因此,如果您的应用程序频繁进行查询,则不断重新连接可能会显著减慢其速度。此外,请注意服务器的max_connection限制。 - spacediver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接