连接池的作用及原理
正常访问数据库的过程中,每次访问都需要创建数据库的连接,这会消耗大量的资源;连接池的就是为数据库连接建立一个“缓冲区”,预先在缓冲池中放入一定数量的连接对象,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去;且连接池允许多个客户端使用缓存起来的连接对象,这些对象可以连接数据库,它们是共享的、可被重复使用的;使用连接池可以节省大量资源,提高程序运行速度。
连接池的基本原理是:先初始化一定的数据库连接对象,并且把这些连接保存在连接池中。这些数据库连接的数量是由最小数据库连接数来设定的。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。当程序需要访问数据库的时候,如果连接池中有空闲的连接,可直接得到一个连接;如果连接池对象中没有空闲的连接,且连接数没有达到最大,会创建一个新的连接从连接池中取出一个连接,数据库操作结束后,再把这个用完的连接重新放回连接池。
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