MySQLdb 最佳实践
我现在正在开发一个Python脚本,这个脚本会处理一些从MySQL数据库中获取的数据。为了访问这些数据,我使用了一个叫做 MySQLdb 的模块。
这个模块遵循了 PEP 249,Python数据库API 的指导方针,主要是创建一个连接对象,然后再创建一个游标对象,用来遍历信息。
目前在我的项目中,每当我需要进行一段MySQL的读取或写入时,我都会创建一个连接对象,完成后再关闭它。不过,我也可以很方便地把这个连接对象传来传去,这样就可以避免重复打开和关闭。
我想问的是:考虑到安全性、资源管理等因素,打开;读取/写入;关闭;然后重复下一个读取/写入;
这种方法比 打开;读取/写入;传递连接给下一个读取/写入;
的方法更好吗?
编辑:再补充一些背景信息。这个特定的Python脚本是高度多线程的。复杂的进程/线程环境会影响哪种方法更合适吗?
3 个回答
作为一个推荐的好习惯,我建议使用 OurSQL,而不是 MySQLdb。
如果我是你,我会在程序运行期间始终保持连接打开,只有在程序结束时才关闭它。这样做的坏处是你的连接池里少了一个连接,但好处是可以省去很多重复的代码。
我认为,最好只在需要的时候保持连接对象的打开状态。虽然有时候不断创建新的连接会比较麻烦,但总体来说,这样做是更好的做法。
一个使用数据库连接的多线程应用程序,最好使用某种连接池。简单来说,连接池就是事先准备好一定数量的数据库连接,这些连接会被放在一个队列里管理。当某个线程需要执行数据库操作时,它就从连接池里拿一个连接。如果连接池里有空闲的连接,就直接给这个线程;如果连接池很忙,那这个线程就得等,直到有其他线程释放出一个连接。当这个线程用完连接后,它会把连接还回连接池,连接池再把这个连接交给其他线程使用。如果没有线程在等连接,连接池就会关闭这个连接。
这种逻辑可能有很多种实现方式,但我非常推荐使用SQLAlchemy,不仅仅是因为它的连接管理功能(虽然你也可以只用它来管理连接)。