使用twisted将mysql插入变成异步执行

对于异步框架而言,这些延迟是无法接受的。因此, Twisted 提供了 twisted.enterprise.adbapi, 遵循DB-API 2.0协议的一个异步封装。

adbapi 在单独的线程里面进行阻塞数据库操作, 当操作完成的时候仍然通过这个线程来进行回调。同事,原始线程能继续进行正常的工作,服务其他请求。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

# 用twisted库将数据进行异步插入到数据库

import pymysql

from twisted.enterprise import adbapi

from twisted.internet import reactor

class MysqlTwistedPipeline(object):

    def __init__(self, dbpool):

        self.dbpool = dbpool

    @classmethod

    def from_settings(cls, settings):

        # 需要在setting中设置数据库配置参数

        dbparms = dict(

            host=settings[‘MYSQL_HOST‘],

            db=settings[‘MYSQL_DBNAME‘],

            user=settings[‘MYSQL_USER‘],

            passwd=settings[‘MYSQL_PASSWORD‘],

            charset=‘utf8‘,

            cursorclass=pymysql.cursors.DictCursor,

            use_unicode=True,

        )

        # 连接ConnectionPool(使用MySQLdb连接,或者pymysql)

        dbpool = adbapi.ConnectionPool("MySQLdb"**dbparms)  # **让参数变成可变化参数

        return cls(dbpool)   # 返回实例化对象

    def process_item(self, item, spider):

        # 使用twisted将MySQL插入变成异步执行

        query = self.dbpool.runInteraction(self.do_insert, item)

        # 添加异常处理

        query.addCallback(self.handle_error)

    def handle_error(self, failure):

        # 处理异步插入时的异常

        print(failure)

    def do_insert(self, cursor, item):

        # 执行具体的插入

        insert_sql = """

                    insert into jobbole_artitle(name, base_url, date, comment)

                    VALUES (%s, %s, %s, %s)

                """

        cursor.execute(insert_sql, (item[‘name‘], item[‘base_url‘], item[‘date‘], item[‘coment‘],))

原文地址:https://www.cnblogs.com/ellisonzhang/p/11113280.html

时间: 2024-10-31 20:32:07

使用twisted将mysql插入变成异步执行的相关文章

MySQL 插入中文不乱码的5种方法

MySQL 插入中文不乱码的5种方法: 方法一: 登录MySQL,先做 set names latin1 ,然后在更新语句或者执行SQL语句 mysql> set names latin1; mysql> source  test.sql; 方法二: 在SQL文件中指定set names latin1;然后登录MySQL,执行相应文件    [[email protected] ~]# cat test.sql  set names latin1; insert ***************

步步深入:MySQL架构总览->查询执行流程->SQL解析顺序

前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来探讨一下其中的知识. 一.MySQL架构总览: 架构最好看图,再配上必要的说明文字. 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解. 从上图中我们可以看到,整个架构分为两层,上层是MySQLD的被称为的‘SQL Layer’,下层是各种各样对上提供接口的存储引擎,被称为‘Storage Engin

JDBC实现往MySQL插入百万级数据

from:http://www.cnblogs.com/fnz0/p/5713102.html JDBC实现往MySQL插入百万级数据 想往某个表中插入几百万条数据做下测试, 原先的想法,直接写个循环10W次随便插入点数据试试吧,好吧,我真的很天真.... DROP PROCEDURE IF EXISTS proc_initData;--如果存在此存储过程则删掉 DELIMITER $ CREATE PROCEDURE proc_initData() BEGIN DECLARE i INT DE

MySQL架构总览->查询执行流程->SQL解析顺序

前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来探讨一下其中的知识. 一.MySQL架构总览: 架构最好看图,再配上必要的说明文字. 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解. 从上图中我们可以看到,整个架构分为两层,上层是MySQLD的被称为的'SQL Layer',下层是各种各样对上提供接口的存储引擎,被称为'Storage Engin

mysql 插入中文报错: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value...

总结写在前面, 总结: 当Java通过jdbc链接mysql插入中文时,要保证程序可以正常执行,而且插入的中文不会乱码, mysql服务器端,对数据表(不是数据库)的编码设置,要保证是支持中文的,例如gbk, gb2312, utf-8 jdbc的连接配置,要开启useUnicode=true,并且要设置一个支持中文的编码,不需要跟mysql表的编码保持一致,只需要支持中文就行.例如characterEncoding=utf8 本身的Java文件的编码需要支持中文 ===============

mysql 插入not null 没有default报错(doesn't have a default value)

今天遇到一个问题,本身在本地数据执行插入sql没啥毛病,但上了测试环境就报错!找个许久发现和mysql的配置有关.查看本地数据库 select @@sql_mode 为空,测试环境执行发现: +---------------------+| @@sql_mode          |+---------------------+| STRICT_TRANS_TABLES |+---------------------+ 这种模式下相当于给sql加入了数据,语法的校验,如果有设置not null

mysql插入数据后返回自增ID的方法

mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢? 方法一:是使用last_insert_id mysql> SELECT LAST_INSERT_ID(); 产生的ID 每次连接后保存在服务器中.这意味着函数向一个给定客户端返回的值是该客户端产生对影响AUTO_INCREMENT列的最新语句第一个 AUTO_INCREMEN

PHP MySQL 插入多条数据

PHP MySQL 插入多条数据 使用 MySQLi 和 PDO 向 MySQL 插入多条数据 mysqli_multi_query() 函数可用来执行多条SQL语句. 以下实例向 "MyGuests" 表添加了三条新的记录: 实例 (MySQLi - 面向对象) <?php$servername = "localhost";$username = "username";$password = "password";$d

[转]向facebook学习,通过协程实现mysql查询的异步化

FROM : 通过协程实现mysql查询的异步化 前言 最近学习了赵海平的演讲,了解到facebook的mysql查询可以进行异步化,从而提高性能.由于facebook实现的比较早,他们不得不对php进行hack才得以实现.现在的php5.5,已经无需hack就可以实现了.对于一个web网站的性能来说,瓶颈多半是来自于数据库.一般数据库查询会在某个请求的整体耗时中占很大比例.如果能提高数据库查询的效率,网站的整体响应时间会有很大的下降.如果能实现mysql查询的异步化,就可以实现多条sql语句同