Django的ORM是非常好用的,哪怕不是做Web项目也值得一用,所以网上也可以找到不少使用 Django 开发非Web项目的资料,因为除了ORM之个,命令行、配置文件等组件也非常好用。

最近用这种方式开发了一个非Web项目,而且是多线程的。有N个工作线程从DB中获取jobs,并把结果写回DB。简单来说就是这样。

项目运行一段时间后,发现数据库连接耗尽了,幸好内存大,然后一直往上调,最后连接数都上九千多一万了。耗尽连接数的时候,PostgreSQL 会出现类似这样的错误:

FATAL: remaining connection slots are reserved for non-replication superuser connections

然后就各种看文档、代码,找问题,其中艰难略下不表,最后大概是这么些个知识点:

  1. Django里的数据库连接是放在线程的 local() 实例中的。
  2. 任何时候,需要一个数据库连接的话,Django就会创建一条出来,或者用本线程已有的那条。
  3. 如果是Web项目,在请求结束的时候,Django会去关闭掉连接。是的,没有连接池。
  4. 因为我们是非Web项目,所以不存在请求结束事件,所以一直没的关闭连接。但本来这个应该也不会造成问题的,因为没关闭就一直用呗,但不知道哪里出了问题,会出现连接泄漏,所以连接数据会一直增长。

最后的解决方案是找时机主动关闭数据库连接,具体到我们项目,就是每次工作线程完成一个任务后,就把它相关的连接关掉,因为我们用的是ThreadPoolExecutor,所以Django很容易做到这一点。

重点代码如下:

from django.db import connectionsdef on_done(future):# 因为每一个线程都有一个 connections,所以这里可以调用 close_all(),把本线程名下的所有连接关闭。connections.close_all()def main():# ...with ThreadPoolExecutor() as executor:while True:future = executor.submit(do, get_a_job())future.add_done_callback(on_done)

主动关闭后,数据库连接数降到与工作线程数相近,并保持稳定。

多线程Django程序耗尽数据库连接的问题相关推荐

  1. 在多线程应用程序中使用循环缓冲区高效地进行日志记录

    在多线程应用程序中使用循环缓冲区高效地进行日志记录 在关键的计算机应用程序的生存期中,日志记录是一件非常重要的活动,特别是当故障的症状并不十分明显时.日志记录提供了故障前应用程序状态的详细信息,如变量 ...

  2. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)...

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

  3. 多线程面试题_线程,代码和数据–多线程Java程序实际运行的方式

    多线程面试题 有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后您才意识到,这是我最想念的那几年,这是非常基本的. 了解多线程Java程序的执行方式就是其中之一. 您肯定已经 ...

  4. 单线程与多线程网络程序架构简介

    文章目录 1 单线程与多线程网络程序架构简介 1.1 服务端单线程处理多客户端 1.2 服务端多进程多端口处理多客户端 1.3 服务端多线程单端口分组处理多客户端 1.4 服务端多线程多端口分组处理多 ...

  5. 线程模型、pthread 系列函数 和 简单多线程服务器端程序

    一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 "线程实现"建立在&qu ...

  6. C# 线程手册 第五章 扩展多线程应用程序 系列

    [第1篇] 什么是线程池 到目前为止我们使用多线程应用程序的目的是尽可能多地使用计算机处理器资源.所以,看起来我们仅需要为每个独立的任务分配一个不同的线程,并让处理器确定在任何时间它总会处理其中的某一 ...

  7. django可以生成exe文件吗_把 Django 程序打包为 exe 可执行文件

    功能背景 我把自动化校准程序写好后,可以在 Pycharm 中运行 Django 程序.但是,这个程序最终要给检定员用的,我不可能在每个检定员的电脑上安装 Django 编程环境让他们使用.所以,要把 ...

  8. Java程序与数据库连接

    一个网络关系数据库应用系统是一个三层次结构.客户机与服务器采用网络连接,客户机端应用程序按通信协议与服务器端的数据库程序通信:数据库服务程序通过SQL命令与数据库管理系统通信. Java程序与数据库连 ...

  9. java8多线程运行程序_线程,代码和数据–多线程Java程序实际运行的方式

    java8多线程运行程序 有些事情是您在学术或培训班上没有学到的,经过几年的工作经验后才逐渐了解,然后才意识到,这是非常基本的事情,我为什么错过了这么多年. 了解多线程Java程序的执行方式就是其中之 ...

最新文章

  1. java 复杂 sql_复杂的SQL条件
  2. 力扣538.把二叉搜索树转换为累加树(JavaScript)
  3. python自动化测试-基于 Python 的接口自动化测试实例
  4. Exchange 2013CU17和office 365混合部署-设置属性筛选(三)
  5. DirectX编译环境配置
  6. ubuntu:磁盘清理
  7. .NET Quartz 配置JOB
  8. python解析地址
  9. php怎么获取图片信息,PHP获取图片信息exif
  10. 变编程用户输入月份,判断这个月份是属于哪个季节?
  11. 使用css动画实现loding效果
  12. 【牛腩新闻】——首页图片加载不出来
  13. 大数据_湖仓一体:下一代存储解决方案
  14. 使用putty下载文件
  15. 基于nodejs的二手物物交换平台【毕业设计源码】
  16. Classification metrics can't handle a mix of continuous and multiclass targets
  17. us news2017计算机科学,2017年USNews最新美国大学计算机专业研究生排名TOP120
  18. OpenAI祭出120亿参数魔法模型!从文本合成图像栩栩如生,仿佛拥有人类的语言想象力...
  19. Unity3D之SQLite的使用
  20. hp服务器 linux,在Linux中监控HP和Dell的服务器(SNMP,Cacti)

热门文章

  1. maxwell报错 Maxwell has been compiled by a more recent version of the Java Runtime (class file version
  2. TheWorld 世界之窗浏览器 1.1RC7版
  3. 分享多个基于QML/Opengles的炫彩效果
  4. 测试管理-测试任务安排
  5. 基带、射频,到底是干什么用的?
  6. android设备唯一码的获取之一手机串号IMEI和网络识别号imsi等
  7. nat123 登陆时提示【连接服务器失败】
  8. 史上最详细黑盒测试用例方法总结(等价类、边界值、因果图等)
  9. 搭建个人网站 (centos 7 + 域名 + 备案)
  10. SpaceVim C++开发环境