关闭

python数据库连接池

标签: python数据库
504人阅读 评论(0) 收藏 举报
分类:

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()

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:53322次
    • 积分:877
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:8篇
    • 译文:0篇
    • 评论:11条
    文章分类
    最新评论