dbpool

笔记-twisted-adbapi-scrapy

走远了吗. 提交于 2020-11-30 02:30:31
笔记-twisted-adbapi-scrapy-mysql 1. 异步插入mysql 在爬虫中需要insert到mysql,但有一个问题是在爬虫环境中commit的及时性与性能冲突。 一般可以在close_spider进行commit,这样做的问题是如果中途数据库崩了,数据丢失,找起来也很麻烦; 但如果在insert_db中直接加入commit,又会使程序执行变得很慢。 这里就可以使用Twisted中提供的以异步方式多线程访问数据库的模块adbapi,可以显著提供程序访问数据库的效率。 adbapi.ConnectionPool方法可以创建一个数据库连接池对象,其中包括多个连接对象,每个连接对象在独立的线程中工作。adbapi只是提供了异步访问数据库的编程框架,再其内部依然使MySQLdb这样的库访问数据库。 dbpool.runInteraction(insert_db,item)以异步方式调用insert_db函数,dbpool会选择连接池中的一个连接对象在独立线程中调用insert_db,其中参数item会被传给insert_db的第二个参数,传给insert_db的第一个参数是一个Transaction对象,其借口与Cursor对象类似,可以调用execute方法执行SQL语句,insert_db执行后,连接对象会自动调用commit方法 1.1. 代码示例 import

django 重写 mysql 连接库实现连接池

…衆ロ難τιáo~ 提交于 2020-11-02 06:44:54
django 重写 mysql 连接库实现连接池 问题 django 项目使用 gunicorn + gevent 部署,并设置 CONN_MAX_AGE 会导致 mysql 数据库连接数飙升,在高并发模式可能会出现 too many connections 错误。该怎么解决这个问题呢?首先看下 django 源码,找到问题的根源。 本文 django 版本为 2.2.3。 问题分析 首先查看连接部分源码: # django/db/backends/mysql/base.py class DatabaseWrapper(BaseDatabaseWrapper): vendor = 'mysql' ... ... ... def get_new_connection(self, conn_params): # 每次查询都会重新建立连接 return Database.connect(**conn_params) ... ... ... 再查看其基类 BaseDatabaseWrapper # django/db/backends/base/base.py class BaseDatabaseWrapper: """Represent a database connection.""" # Mapping of Field objects to their column types.