Postgresql数据库连接池

连接池的作用及原理

正常访问数据库的过程中,每次访问都需要创建数据库的连接,这会消耗大量的资源;连接池的就是为数据库连接建立一个“缓冲区”,预先在缓冲池中放入一定数量的连接对象,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去;且连接池允许多个客户端使用缓存起来的连接对象,这些对象可以连接数据库,它们是共享的、可被重复使用的;使用连接池可以节省大量资源,提高程序运行速度。

连接池的基本原理是:先初始化一定的数据库连接对象,并且把这些连接保存在连接池中。这些数据库连接的数量是由最小数据库连接数来设定的。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。当程序需要访问数据库的时候,如果连接池中有空闲的连接,可直接得到一个连接;如果连接池对象中没有空闲的连接,且连接数没有达到最大,会创建一个新的连接从连接池中取出一个连接,数据库操作结束后,再把这个用完的连接重新放回连接池。

Python连接PostgreSql

首先安装 psycopg2模块,pycopg2是Python编程语言的PostgreSQL数据库的适配器。

pip install psycopg2

PostgreSql连接池封装组件

from config import *
from psycopg2 import pool
from get_setting_info import GetSettingInfo


class PostgreSql(object):
    def __init__(self):
        try:
            self.connectPool = pool.SimpleConnectionPool(2, 10, host=GetSettingInfo().get_option('db_connection',
                                                                                                 'host'),
                                                         port=GetSettingInfo().get_option('db_connection',
                                                                                          'port'),
                                                         user=GetSettingInfo().get_option('db_connection',
                                                                                          'user'),
                                                         password=GetSettingInfo().get_option('db_connection',
                                                                                              'password'),
                                                         database=GetSettingInfo().get_option('db_connection',
                                                                                              'database'),
                                                          keepalives=1,
                                                         keepalives_idle=30, keepalives_interval=10,
                                                         keepalives_count=5)
        except Exception as e:
            print(e)

    def getConnect(self):
        conn = self.connectPool.getconn()
        cursor = conn.cursor()
        return conn, cursor

    def closeConnect(self, conn, cursor):
        cursor.close()
        self.connectPool.putconn(conn)

    def closeAll(self):
        self.connectPool.closeall()

    # 执行增删改
    def execute(self, sql, value=None):
        conn, cursor = self.getConnect()
        try:
            res = cursor.execute(sql, value)

            conn.commit()
            self.closeConnect(conn, cursor)
            return res
        except Exception as e:
            conn.rollock()
            raise e

    def insert(self, sql, value=None):
        conn, cursor = self.getConnect()
        try:
            cursor.execute(sql, value)
            conn.commit()
            return {'result': True, 'id': int(cursor.lastrowid)}
        except Exception as err:
            conn.rollback()
            return {'result': False, 'err': err}
        finally:
            # 关闭连接放回连接池、防止连接耗尽
            self.closeConnect(conn, cursor)
            # cursor.close()
            # conn.close()

    def selectOne(self, sql):
        conn, cursor = self.getConnect()
        cursor.execute(sql)
        result = cursor.fetchone()
        self.closeConnect(conn, cursor)
        return result

    def selectAll(self, sql):
        conn, cursor = self.getConnect()
        cursor.execute(sql)
        result = cursor.fetchall()
        self.closeConnect(conn, cursor)
        return result
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值