廖雪峰教程之学习笔记_webapp实战项目_MySQL连接池

在廖雪峰的教程实战项目中,构建WebApp首先第一步就是编写ORM,ORM全称“Object Relational Mapping”,即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作SQL语句。

ORM就涉及到对数据库(在本例中是MySQL)的操作。首先,创建连接池,然后封装增删改查等操作。

一、连接池是啥

官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。

个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。

传统统链接:     一般来说,Java应用程序访问数据库的过程是:

  ①装载数据库驱动程序;

  ②通过JDBC建立数据库连接;

  ③访问数据库,执行SQL语句;

  ④断开数据库连接。

使用了数据库连接池的机制:
(1)  程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源
重点是: 数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个
具体细节参考文章:https://www.cnblogs.com/aspirant/p/6747238.html

二、具体代码

创建连接池的代码如下:

async def create_pool(loop, **kw):
    logging.info('create database connection pool...')
    global __pool
    __pool = await aiomysql.create_pool(
        host=kw.get('host', 'localhost'),
        port=kw.get('port', 3306),
        user=kw['user'],
        password=kw['password'],
        db=kw['db'],
        charset=kw.get('charset', 'utf8'),
        autocommit=kw.get('autocommit', True),
        maxsize=kw.get('maxsize', 10),
        minsize=kw.get('minsize', 1),
        loop=loop
    )
请注意:使用了async和await关键字,这是一个coroutine(协程)。子程序调用是通过栈实现的,一个线程就是执行一个子程序。

子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。

协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。

这个协程的参数:

接受一个loop(事件循环)和一个kw(关键字参数,即dict)。可以看出dict中的key应当包括host,port,user,password,db,charset,autocommit,maxsize,minsize。

这个协程干了啥:

这个协程首先声明了全局变量__pool,然后调用了aiomysql.creat_pool()函数,并把返回值赋值给了__pool。

这个协程无返回值。

猜你喜欢

转载自blog.csdn.net/bird333/article/details/80657344
今日推荐