近期,想了深入了解一下python中的数据库池概念,其实目前没有遇到过需要创建数据库池的业务场景,因为当前对数据的处理,写了几个后台数据处理逻辑,有些是1个小时处理一次,所以在代码结构上就是每隔一个小时就会重新连接一次数据库,连接好后,执行算法,将跑出来的结果存入数据库。数据量其实也不是很大,就万条左右,写入速度也已经很快了。所以构建数据池其实也没有必要,对于效率的提升并不明显。但是如果是做一个数据目录,或者说要做一个数据服务接口,如果这个服务接口使用人群较大的时候,如果没有数据库池,那么数据连接很快就会达到上限,这个时候,数据库连接就会超出最大限度。其实超出上限报错在此处并不关心,因为在这里我们关心的是数据库不停的构建连接,会影响效率。

一个最常见的业务场景就是将一亿条数据写入到数据库中,常规解决方案中,我们就是构建一个数据库连接,然后循环写入,并提交。我们要知道,在循环中,操作的是游标,而不是数据库。即对象是游标。如果写入的时间过长,数据库会自动关闭连接,一般的数据库长连接的时长大概是6小时。一亿条数据写入,6小时其实足够用了,即使是执行一条语句提交一次,这样的效率也足够用。但如果是很多条?比如几个T的数据或者实时数据就比较困难了。因为当前的工作中,有图数据库,数据量非常大。所以如果没有构建数据库池,数据在未完全写入的情况下,数据库连接报错,会带来较多的影响,如浪费时间,浪费磁盘写入,还要把数据给删除掉,还要去头疼如何去接着报错的地方继续读取并写入。如果无法定位到报错前的最后一次读取位置,还需要把数据删除重新写入。这样成本就很高了,而且如果第一次写入报错,那么第二次在不改变硬件的情况下,提升不会很高,也就是第二次仍然会报相同错误的概率比较高。

在这样的情况下,就需要去构建一个不会掉线的长连接。上边提到数据库默认的长连接时长为6小时左右,那么我们就可以构建4个连接构成一个数据库连接池。其实数据库连接池是一个特有的名词,说白了就是多个数据库连接的集合体,保证在程序运行的情况下,总有一个连接所创建的游标是可以使用的。

在未查找Python构建数据库连接池之前,我先提出一套数据库连接池方案:

常规连接中,我们在操作数据库进,创建连接后,接下来的操作我们更多的是使用游标对象进行。所以我们可以把数据库连接也做为一个对象进行操作即可。写方法,对数据库连接进行定时创建,并返回游标。让程序持续运行。即每隔6个小时创建一个新的连接,而且这个新的连接需要不能影响当前程序运行,在这里的话,我觉得多进程会更合适一些。

整个程序在一个while循环下,操作游标对象,再构建一个小的for循环用来执行数据库连接的创建。其实昨天晚上想了一下,一个while循环其实就可以搞定,没有必要上两个循环,让最后一次执行完的结果再返回为起始状态即可。这样就可以构建一个有上下限的死循环。