【Python + Oracle】Python Oracle连接池—改进版

该博客介绍了如何使用Python的DBUtils模块和cx_Oracle库创建Oracle数据库连接池,包括配置连接信息、获取连接、执行SQL及关闭连接等操作。示例代码展示了如何初始化连接池、执行查询和插入操作。
摘要由CSDN通过智能技术生成

# -*- coding: utf-8 -*-

 

"""

--------------------------------------
@File       : oracle_pool.py
@Created on : 2020/4/21 15:47
-------------------------------------
"""

 

import cx_Oracle as Oracle

from DBUtils.PooledDB import PooledDB

 

 

class OraclePool:

    """

    1) 这里封装了一些有关oracle连接池的功能;

    2) sid和service_name,程序会自动判断哪个有值,

        若两个都有值,则默认使用service_name;

    3) 关于config的设置,注意只有 port 的值的类型是 int,以下是config样例:

        config = {

            'user':         'maixiaochai',

            'password':     'maixiaochai',

            'host':         '192.168.158.1',

            'port':         1521,

            'sid':          'maixiaochai',

            'service_name': 'maixiaochai'

        }

    """

 

    def __init__(self, config):

        """

        获得连接池

        :param config:      dict    Oracle连接信息

        """

        self.__pool = self.__get_pool(config)

 

    @staticmethod

    def __get_pool(config):

        """

        :param config:        dict    连接Oracle的信息

        ---------------------------------------------

        以下设置,根据需要进行配置

        maxconnections=6,   # 最大连接数,0或None表示不限制连接数

        mincached=2,        # 初始化时,连接池中至少创建的空闲连接。0表示不创建

        maxcached=5,        # 连接池中最多允许的空闲连接数,很久没有用户访问,连接池释放了一个,由6个变为5个,

                            # 又过了很久,不再释放,因为该项设置的数量为5

        maxshared=0,        # 在多个线程中,最多共享的连接数,Python中无用,会最终设置为0

        blocking=True,      # 没有闲置连接的时候是否等待, True,等待,阻塞住;False,不等待,抛出异常。

        maxusage=None,      # 一个连接最多被使用的次数,None表示无限制

        setession=[],       # 会话之前所执行的命令, 如["set charset ...", "set datestyle ..."]

        ping=0,             # 0  永远不ping

                            # 1,默认值,用到连接时先ping一下服务器

                            # 2, 当cursor被创建时ping

                            # 4, 当SQL语句被执行时ping

                            # 7, 总是先ping

        """

        dsn = None

        host, port = config.get('host'), config.get('port')

 

        if 'service_name' in config:

            dsn = Oracle.makedsn(host, port, service_name=config.get('service_name'))

 

        elif 'sid' in config:

            dsn = Oracle.makedsn(host, port, sid=config.get('sid'))

 

        pool = PooledDB(

            Oracle,

            mincached=5,

            maxcached=10,

            user=config.get('user'),

            password=config.get('password'),

            dsn=dsn

        )

 

        return pool

 

    def __get_conn(self):

        """

        从连接池中获取一个连接,并获取游标。

        :return: conn, cursor

        """

        conn = self.__pool.connection()

        cursor = conn.cursor()

 

        return conn, cursor

 

    @staticmethod

    def __reset_conn(conn, cursor):

        """

        把连接放回连接池。

        :return: 

        """

        cursor.close()

        conn.close()

 

    def __execute(self, sql, args=None):

        """

        执行sql语句

        :param sql:     str     sql语句

        :param args:    list    sql语句参数列表

        :param return:  cursor

        """

        conn, cursor = self.__get_conn()

        

        if args:

            cursor.execute(sql, args)

        else:

            cursor.execute(sql)

 

        return conn, cursor

 

    def fetch_all(self, sql, args=None):

        """

        获取全部结果

        :param sql:     str     sql语句

        :param args:    list    sql语句参数

        :return:        tuple   fetch结果

        """

        conn, cursor = self.__execute(sql, args)

        result = cursor.fetchall()

        self.__reset_conn(conn, cursor)

 

        return result

 

    def fetch_one(self, sql, args=None):

        """

        获取全部结果

        :param sql:     str     sql语句

        :param args:    list    sql语句参数

        :return:        tuple   fetch结果

        """

        conn, cursor = self.__execute(sql, args)

        result = cursor.fetchone()

        self.__reset_conn(conn, cursor)

 

        return result

 

    def execute_sql(self, sql, args=None):

        """

        执行SQL语句。

        :param sql:     str     sql语句

        :param args:    list    sql语句参数

        :return:        tuple   fetch结果

        """

        conn, cursor = self.__execute(sql, args)

        conn.commit()

        self.__reset_conn(conn, cursor)

 

    def __del__(self):

        """

        关闭连接池。

        """

        self.__pool.close()

 

 

def demo():

    config = {

        'user': 'maixiaochai',

        'password': 'maixiaochai',

        'host': '192.168.158.1',

        'port': 1521,

        'sid': 'maixiaochai',

        'service_name': 'maixiaochai'

    }

 	# sql = 'INSERT INTO USER VALUES (:1, :2, :3)'
    # param = ['1', '2', '3']
    # orcl = OraclePool()
    # res = orcl.execute_sql(sql, param)

    sql = "SELECT COUNT(*) FROM MAIXIAOCHAI"

    orcl = OraclePool(config)

    result = orcl.fetch_all(sql)

    print(result)

 

 

if __name__ == "__main__":

    demo()

程序托管GitHub-OraclePoolh

转载:https://blog.csdn.net/maixiaochai/article/details/82986517

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值