python数据库连接池
python-oracle数据库连接池
使用连接池,可以避免每次请求都创建一个连接,直接从连接池获取连接,大大加快连接速度和效率。
python的数据库连接池主要是DBUtils,详细的介绍可以参考:
http://www.tuicool.com/articles/U3ymUb7
这里介绍cx_oracle模块自带的连接池,同时也给出DBUtils的连接池简单使用方法。
# file: pyoracle.py
# cx_oracle自带的线程池模块
import cx_oracle
# 定义全局变量
class global_val:
pools=None
class oraclepool(object):
def __init__(self, user="abc", pwd="123456", ip="192.168.1.16", db="orcl"):
self.user = user
self.password = pwd
self.ip = ip
self.db = db
self.dsn = ip + "/" + db # 注意,oracle接受的参数其实是 dsn
self.conn = OraclePool.get_conn(self)
self.cursor = self.conn.cursor()
def get_conn(self):
"""创建连接池,返回数据库连接"""
if GOrcl.pools is None:
GOrcl.pools = cx_Oracle.SessionPool(user=self.user, password=self.password, dsn=self.dsn, min=1, max=30,
increment=2)
return GOrcl.pools.acquire()
def release(self):
"""连接不用了,要返回连接池"""
GOrcl.pools.release(self.conn)
def execute(self, sql):
"""执行sql语句"""
self.cursor.execute(sql)
self.conn.commit()
def get_conn_num(self):
"""获取当前的激活的连接数"""
return GOrcl.pools.busy
# ------------------------------------------------------------
# 使用方法:
# file: test.py
import pandas as pd
import pyoracle
# 实例化
orcl = pyoracle.oraclepool()
# 使用pandas读取数据
data = pd.read_sql("select sysdate from daul", orcl.conn)
# 类的方法
data = orcl.execute("select 1 from dual")
# 将连接放回到连接池
orcl.release()
DBUtils模块,其实更加通用,因为支持所有的标准的数据库,比如mysql,sqlserver等。
这里的例子参考下面的博文:
http://blog.csdn.net/zbc1090549839/article/details/51336458
# file: pyoracle.py
import cx_oracle
from DBUtils.PooledDB import PooledDB
class oracle(object):
"""数据连接对象,产生数据库连接池. 此类中的连接采用连接池实现获取连接对象:conn = oracle.getConn() 释放连接对象;conn.close()或del conn """
# 连接池对象
__pool = None
def __init__(self):
# 数据库构造函数,从连接池中取出连接,并生成操作游标
self._conn = oracle.get_onn()
self._cursor = self._conn.cursor()
@staticmethod
def get_onn():
""" 静态方法,从连接池中取出连接 return oracle.connection """
if oracle.__pool is None:
user = config.global_var.user
pwd = config.global_var.pwd
ip = config.global_var.ip
db = config.global_var.db
dsn = ip + "/" + db
__pool = PooledDB(creator=cx_Oracle, mincached=1, maxcached=20, user=user, password=pwd,
dsn=dsn)
return __pool.connection()
def execute(self, sql):
"""执行指定sql语句"""
self._cursor.execute(sql) # 执行语句
self._conn.commit() # 然后提交
def close(self):
"""释放连接池资源"""
self._cursor.close()
self._conn.close()
#-------------------------------
# 测试
# 1.导入类
import pyoracle
# 2.创建连接池
orcl=pyoracle.oracle()
# 3.使用pandas读取数据
sql = "select sysdate from dual"
df = pd.read_sql(sql, con=orcl._conn) # 访问私有变量的方式
print(df)
# 4.执行语句
orcl.execute(sql)
# 5.最后记得关闭连接,也就是将连接放回连接池
orcl.close()
还没有评论,来说两句吧...