1. 背景
django使用连接池连接数据库代理,数据库代理连接了主备两台数据库,当主数据库意外挂掉,而代理没有感知到的时候,django连接池内的长连接就会处于占用状态而永远不会被关闭
2. django数据库连接池参数
1. 数据库使用的是pg,因此引擎使用的是dj_db_conn_pool.backends.postgresql+sqlalchemy 2. options中可添加connect_timeout参数,控制连接数据超时时间 3. pool_options参数,大小写都可以,最终都会被转换成小写pre_ping, 默认True,表示在获取数据库连接池中的连接时,先去执行select 1,验证连接是否可用timeout, 默认30s,表示从连接池中获取空闲连接时超时时间,超过这个时间,就会返回失败。
(配置了,但是感觉没有用。应该是在连接池没满的时候,配置这个参数不会超时,会一直等待连接池去获取一个新的连接。但是如果连接池满了,就会等待这个时间,超时获取不到空闲连接,就会报错)recycle, 默认60*15 15分钟,连接被回收的时间,只有空闲的连接才会被回收pool_size 默认10,连接池中的最大连接数量max_overflow 默认10,当连接池满了之后,可以获取额外10个连接。如果额外10个之后,还有请求就要等待timeout秒,
如果在这个时间有空闲的连接就会分配给新的请求,如果超时了还没有空闲连接,就会抛出异常。额外连接在一定时间(不会维护,用完就丢)之后会被关闭,不会进入连接池,
也就是连接池始终会保持最多pool_size的数量,max_overflow用完就丢
3. 连接池工作流程(猜测,未证实,比较菜,没有找到代码逻辑在哪个位置)
连接池里面会维护多个数据库的连接,就是你在settings的DATABASES中配置的各个数据库,我们一般只配一个数据库的话,就默认叫做default。此处我们只讨论配置一个数据库的情况。当代码中直行道有需要执行数据库操作的时候,会调用某个dj_db_conn_pool/core/mixins/core中的一个mixin类的get_new_connection,这个放回会调用队列池(QueuePool,默认的配置)的connect方法,connect会调用检出函数checkout,然后调用_do_get方法,判断是否超过连接池最大数量,然后去连接池中获取一个空闲的连接。 1.1 如果没有空闲连接会抛出异常,然后去重新申请一个新的连接 1.2. 如果有空闲连接,会从连接池队列中去获取一个(默认后进先出)连接 2. 如果是新建立的连接不会去pre_ping(因为是新获取的,所以没有必要),如果不是新获取的并且配置pre_ping为True,就会去执行select 1,测试连接是否可用