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

Oracle 连接池第四版。

编程语言

Python

语言版本

3.5.3

实现功能

oracle 连接池,解决频繁连接oracle数据库带来的连接资源耗费问题

程序托管

GitHub-OraclePool

修改日期

2020年8月3日

version 4.0 改进说明:

**[2020-04-21]**

+ 修复连接用完后,不放回连接池的`bug`

+ 修复使用类名称获取`pool`时的类名称错误(`OrclConnPool`),改为用`self`

+ 改进了对`config`连接信息的判断逻辑,使得`config`的配置更加简化

+ 改进了新的注释,使用更加清晰

+ 改进了部分代码的格式,使得其更规范

+ 新增`fetch_all`和`fetch_one`

+ 优化了`demo`内容和格式,使得其更规范

程序源码:

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

"""

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

@File : oracle_pool.py

@Author : maixiaochai

@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 = "SELECT COUNT(*) FROM MAIXIAOCHAI"

orcl = OraclePool(config)

result = orcl.fetch_all(sql)

print(result)

if __name__ == "__main__":

demo()

version 3.0 改进说明:

*)修复一个 Bug,该 Bug导致连接池中有且仅有一个连接资源被使用,其余空闲。

*) 2019-12-27 12:45:21 by MaiXiaochai

version 2.0 改进说明:

*)将原来的 orcl_pool.py 文件单独拿出来,创建新库 OracleConnectionPool,便于编辑和分享;

*)更新"程序链接"内容和 URL。

*)2019-5-29 16:54:37 by MaiXiaochai

*)由原来的只能维持一个连接池改为可维持多个连接池;

*)加入了对 service_name 连接方式的支持;

*)添加了析构函数,对连接池资源进行回收;

*)对相关的代码注释进行了规范,使其看起来比较整洁;

*)添加了一个使用样例。

*)2019-3-28 19:13:47 by MaiXiaochai

程序源码:

version 3.0

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

# @File: oracle_conn_pool.py

# @Project: OraclePool

# @Date: 2019/5/29 15:19

# @Author: MaiXiaochai

# @Modify: 2020/1/6 16:02

import cx_Oracle as Oracle

from DBUtils.PooledDB import PooledDB

class OraclePool(object):

"""

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

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

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

若只想用其中一个,则只需要把另一个设置为空即可。如,service_name = ''

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

orcl_cfg = {

'user': 'user_name_str',

'passwd': 'passwd_str',

'host': 'xxx.xxx.xxx.xxx_str',

'port': port_int,

'sid': 'sid_str',

'service_name': 'service_name_str'}

"""

def __init__(self, config):

self.pool = OrclConnPool.__get_pool(config)

@staticmethod

def __get_pool(conf):

"""

一些 PoolDB 中可能会用到的参数,根据实际情况自己选择

mincached: 启动时开启的空连接数量

maxcached: 连接池最大可用连接数量

maxshared: 连接池最大可共享连接数量

maxconnections: 最大允许连接数量

blocking: 达到最大数量时是否阻塞

maxusage: 单个连接最大复用次数

:param conf: dict 连接Oracle的信息

"""

host, port, sid, service_name = conf.get('host'), conf.get('port'), conf.get('sid'), conf.get('service_name')

dsn = None

if sid:

dsn = Oracle.makedsn(host, port, sid=sid)

elif service_name:

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

__pool = PooledDB(Oracle, user=conf['user'], password=conf['passwd'], dsn=dsn, mincached=5, maxcached=30)

return __pool

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

"""

执行sql语句

:param sql: str sql语句

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

"""

cur = self.pool.connection().cursor()

if args:

cur.execute(sql, args)

else:

cur.execute(sql)

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

"""

获取全部结果

:param sql: str sql语句

:param args: list sql语句参数

:return: tuple fetch结果

"""

cur = self.pool.connection().cursor()

if args:

cur.execute(sql, args)

else:

cur.execute(sql)

return cur.fetchall()

def __del__(self):

"""

在实例资源被回收时,关闭该连接池

"""

try:

self.pool.close()

except Exception:

pass

def simple_demo():

orcl_cfg = {

'user': 'hello',

'passwd': 'Python',

'host': '192.168.158.xxx',

'port': 1521,

'sid': '',

'service_name': 'MaiXiaochai'}

test_sql = "SELECT COUNT(1) FROM TEST_PYTHON"

orcl = OraclePool(orcl_cfg)

orcl.execute_sql(test_sql)

res = orcl.cur.fetchone()

print(res)

if __name__ == "__main__":

simple_demo()

传送门:GitHub:OraclePool

The end.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么有些大公司的技术弱爆了?

阅读本文大概需要5分钟。最近好几个大厂的读者不约而同跟我聊到公司采用的技术栈很落后的问题,一个读者还感叹:是不是大厂的领导都是混子?技术这么弱还不如之前呆的小公司。回复了几个读者朋友之后,这里也想跟大家分享下这个问题&…

普通程序员转型深度学习指南

AI领域人才奇缺,炙手可热的AI专业应届生年薪30万起步,AI毕业生基本不用找工作,都已经被企业早早预定。AI人才究竟有多紧缺?据腾讯研究院《全球人工智能人才白皮书》报告数据,目前全球AI领域人才仅约30万,全…

sm缩写代表什么意思_pe、PE在电气有代表什么意思,你发现没有,电气技术很有意思...

pe、pe、pe这些是什么意思解说1,听小课堂电小二跟你讲PE是Protecting Earthing的缩写,简体中文名称称之为“保护导体”,也就是我们通常所说的“地线”,我国规定PE线为黄绿双色线 。1.PE线的应用PE线是专门用于将电气装置外露导电部…

java短信接口 调用_带你了解短信接口的调用

查看接口说明image.png注册账号注册成功的页面如下:image.png设置短信内容的签名比如:将短信签名设置为yzcimage.png查取短信接口密钥image.png设计Java程序短信发送客户端的代码如下:package day02;import org.apache.http.Header;import or…

抢鲜体验.NET6 Preview1,配上Docker简直停不下来!

新年复工后的第一件大事儿就是上周三重磅发布的.NET6 Preview1,发布了很多的新特性,让人欢欣鼓舞!然而有些小伙伴儿却担心学不过来了,其实不用担心的,照常用你的.NET5,等11月份.NET6 LTS正式发布了&#xf…

实用金属材料手册_机械密封选用手册

《机械密封选用手册》较系统地介绍了机械密封的原理、结构、材料及辅助系统装置及安装、使用方法和故障分析等。内容以产品样本图册为主,并做了相应的结构说明。本书重点介绍了机械密封的选用方法,读者可根据介质、温度、压力、转速等工况条件选取合适的…

为什么在人工智能火爆的现在,我们还在做数据分析

这些年来,随着进入大数据时代,各行各业均有一个词频频被提到,那就是数据分析。那么数据分析究竟是什么呢?数据分析就是指用适当的统计分析方法对收集来的大量数据进行处理分析,提取有用信息并形成结论,从而…

加入域--深入理解DNS在域中作用

接前面《创建windows域--深入理解域概念》这篇文章,来说说加入域的问题。 有人加入域时很顺利,几分钟甚至几秒的功夫,完毕。有人加入域时很恼火,折腾了一天甚至几天始终丈二和尚莫不找头脑。有个学生,很勤奋&#xff0…

学生成绩管理java代码_Java swing学生成绩管理系统

项目描述本系统主要分为5大功能模块,分别为:登录模块:实现用户登录。参数设置:包括学生年级设置、班级设置、考试科目设置以及考试类别设置。基本信息:包括学生信息、教师信息以及学生考试成绩信息管理。系统查询&…

你可能不知道的按位与、或运算技巧

背景最近在园子里看到了这篇文章,看完这篇会有意外收获:C#枚举高级战术https://mp.weixin.qq.com/s/yipaL6Acil-uxq_bDDgdyg想起了很久之前的自己的一篇总结,特地找出来说说概念在工作中遇到按位或组合权限串。一直不是特别明白。今天终于花了…

web高德地图怎么加载离线地图_怎么验证全国离线卫星地图缓存文件的完整性

1. 概述自从我们发布了《如何离线浏览全国7137GB海量谷歌卫星离线影像》一文后,很多用户都在问下载海量数据的具体方法,为了解决大家的困惑,于是又分别发布了《如何一次性下载全国谷歌卫星影像地图数据的方法》和《如何一次性下载谷歌地球的全…

为什么程序员发现不了自己的BUG?

最近在朋友圈流行了这样的一个小学数学题,当然结果是“出乎意料”,看似简单的结果,几乎很少有人做对,而分析下来的原因无非是惯性思维下的粗心导致的完全错误,今天小编就带大家一起分析下思考过程。看图可知&#xff0…

IP代理在网络游戏中的应用

前些天同学开了打钱工作室,想玩外服魔兽打点游戏B赚点钱,可是不会上外国魔兽,叫我帮忙给看看怎么才能玩外服。现在我就来做个简单的教程,说明一下怎么玩外服吧。先说明一些现状:一些海外网络游戏服务器和带宽资源有限&…

python游戏代码运行不了_无法使我的tic tac toe游戏在python中正确运行

转不到“玩家1”的原因是你的支票中缺少一个空格。你也没有正确地检查一个玩家何时获胜,这就是为什么你会有这种奇怪的行为。你需要检查每个位置,而不仅仅是最后一个。我还添加了对用户输入的检查,以确保用户输入的是一个数字,如果不是,它不会崩溃。我完全不明白为什么你基本上…

Csv解析CsvFile

Excel导出是非常常见的需求,而大多数时候只需要导出CSV格式文件即可。Csv文件非常简单以及快速,除了日常导出报表,还可以导出大量数据用于跨系统数据交换,曾经多次遇到一次性导出数百万行数据。NewLife.Core 内封装了CsvFile类&am…

java流的序列化_Java中的对象流和序列化介绍

最近,在讲流的使用,其中对象流的作用其实就是将自定义类的对象与流之间相互转换的流。看起来还是挺简单的,那么看下面的例子:public class Student{private int id;private String name;private String sex;private String tel;//…

【干货】人人都能看懂的LSTM

推荐阅读时间:8min~13min推荐理由:这是在看了台大李宏毅教授的深度学习视频之后的一点总结和感想。看完介绍的第一部分RNN尤其LSTM的介绍之后,整个人醍醐灌顶。10. 从RNN说起循环神经网络(Recurrent Neural Network,RN…

Csv数据库CsvDb

在工控领域,经常遇到断电关机数据库文件损坏的情况,SQLite如此,LiteDb也是这样。ZTO有数万自动化扫描设备,每天都有数百台设备因断电数据库损坏等原因,而不得不重装软件。因此,设计了CsvDb,用于…

Lucene的一些基本使用方法和概念 (JAVA)

Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。其功能非常的强大,但api其实很简单的,它最主要就是做两件事:建立索引和进行搜索。1. 建立索引时最重要的几个术语* Document:一个要进行索引的单元,相当于数据库的一行…

java jdbc分页_使用JDBC进行分页查询

package day03;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.Statement;import day01.JdbcUtil;/** 演示:JDBC的批量处理*/public class Demo3 {public static void main(String[] args) {// testI…