问题:

接到需求,告知项目的oracle连接次数过多,对系统造成太过大的负担,要求减少oracle数据库的连接次数

分析:

仔细分析代码以后,发现产生问题的原因,在于之前要求提升oracle监控的监控速度时,将oracle监控的脚本代码,拆分成了多个子进程。导致每次循环服务器都会产生子进程次数的数据库连接,产生了过多的不必要连接

解决方案:

讨论分析过后,决定更改代码的架构,用DBUtils的连接池功能+多线程(http://www.cnblogs.com/fnng/p/3670789.html)的组合,替代现有的 多进程+子进程对数据库的单次连接

DBUtils:

DBUtils 是一套允许线程化 Python 程序可以安全和有效的访问数据库的模块。

下载并安装:

$ wget https://pypi.python.org/packages/65/65/89afee016aca7fbb5c1642e6ef3864d80af808dc5efa7367b328093eece9/DBUtils-1.1.tar.gztar -zxf DBUtils-1.1.tar.gzcd DBUtils-1.1
python setup.py install

使用:

  参考:http://blog.163.com/power_mr/blog/static/138744007201391823253744/

  导入:import DBUtils.PersistentDB

  • dbapi :数据库接口
  • mincached :启动时开启的空连接数量
  • maxcached :连接池最大可用连接数量
  • maxshared :连接池最大可共享连接数量
  • maxconnections :最大允许连接数量
  • blocking :达到最大数量时是否阻塞
  • maxusage :单个连接最大复用次数
#不用连接池的MySQL连接方法
import MySQLdb
conn= MySQLdb.connect(host='localhost',user='root',passwd='pwd',db='myDB',port=3306)
cur=conn.cursor()
SQL="select * from table1"
r=cur.execute(SQL)
r=cur.fetchall()
cur.close()
conn.close()

#用连接池后的连接方法
import MySQLdb
from DBUtils.PooledDB import PooledDB
pool = PooledDB(MySQLdb,5,host='localhost',user='root',passwd='pwd',db='myDB',port=3306) #5为连接池里的最少连接数

conn = pool.connection()  #以后每次需要数据库连接就是用connection()函数获取连接就好了
cur=conn.cursor()
SQL="select * from table1"
r=cur.execute(SQL)
r=cur.fetchall()
cur.close()
conn.close()

自用:

生成mysql池

    # get mysql PooledDBlogger.info("get MySQL connect.")host = get_config('monitor_server','host')port = get_config('monitor_server','port')user = get_config('monitor_server','user')passwd = get_config('monitor_server','passwd')dbname = get_config('monitor_server','dbname')try:# mincached 最少的空闲连接数,如果空闲连接数小于这个数,pool会创建一个新的连接mysql_pool = PooledDB(MySQLdb,mincached=20,blocking=True,host=host,user=user,passwd=passwd,port=int(port),db=dbname,connect_timeout=5,charset='utf8')glob.set_value('mysql_conn',mysql_pool)except Exception,e:print "start mysql(pooledDB) error:" + str(e)

生成oracle池:

    #get oracle servers listlogger.info("get Oracle connect.")servers=func.mysql_query("select id,host,port,dsn,username,password,tags from db_servers_oracle where is_delete=0 and monitor=1;")if servers:for row in servers:server_id=row[0]host=row[1]port=row[2]dsn=row[3]username=row[4]password=row[5]tags=row[6]ora_dsn = host + ":" + port + "/" + dsntry:oracle_pool = PooledDB(cx_Oracle,mincached=20,blocking=True,user=username,password=password,dsn=ora_dsn)conn_name = "server_"+str(server_id)+"_pool"glob.set_value(conn_name,oracle_pool)except Exception, e:logger_msg="check oracle server connect %s : %s" %(ora_dsn,str(e).strip('\n'))logger.warning(logger_msg)

问题:

改动过程中,碰到了比较难以解决的“疑难杂症”:脚本在执行过程中,会出现异常导致无限执行的死循环中断现象,同时出现中断时,不产生异常报错,导致bug的解决比较困难

为了找出异常的部分,对代码进行了更详细的测试:

  1. 搭建代码框架,进行框架测试
  2. 向框架中填充基本内容,进行基本内容测试
  3. 对代码的各个部分,进行实验性测试:
连接池 + 单index线程循环 + 服务器循环外join + 执行oracle操作 -> 异常退出单连接 + 单index线程循环 + 服务器循环外join + 执行oracle操作 -> 异常退出单连接 + 单index线程循环 + 服务器循环外join + 不执行oracle操作 -> 正常连接池 + 单index线程循环 + 服务器循环外join + 不执行oracle操作 -> 正常连接池 + 单index线程循环 + 服务器循环外join + 执行单条oracle操作 -> 异常

确认了问题产生于oracle数据库

确认了问题所在后,经过多次试验,发现在使用多线程连接数据库的过程中,打印出了两次异常:

  KPEDBG_HDL_POP_FCPTRKPEDBG_HDL_POP_FCPTRKPEDBG_HDL_POP_FCPTRORA-24550: signal received: [si_signo=11] [si_errno=0] [si_code=1] [si_int=16] [si_ptr=0x10] [si_addr=(nil)]

百度后修改oracle客户端的配置文件(sqlnet.ora)

#路径:/usr/lib/oracle/12.2/client64/network/admin/sqlnet.ora
DIAG_ADR_ENABLED=OFF
DIAG_SIGHANDLER_ENABLED=FALSE
DIAG_DDE_ENABLED=FALSE

同时,改动oracle数据库的使用方式:

从之前获取连接以后,使用连接作为oralce监控方法的传输参数,

改为,传递oracle连接池的池连接(oralce_pool)作为参数,在方法内,生成新的oracle连接

1.     搭建代码框架,进行框架测试

转载于:https://www.cnblogs.com/blitheG/p/7772389.html

python - DBUtils 连接池减少oracle数据库的连接数相关推荐

  1. python oracle连接池_python - DBUtils 连接池减少oracle数据库的连接数

    问题: 接到需求,告知项目的oracle连接次数过多,对系统造成太过大的负担,要求减少oracle数据库的连接次数 分析: 仔细分析代码以后,发现产生问题的原因,在于之前要求提升oracle监控的监控 ...

  2. DBUtils连接池,websocket

    1.mysql数据库连接池 概念:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放. 这样 ...

  3. oracle数据库安装提示M,Python第13课:oracle数据库的安装

    Python第13课:oracle数据库的安装 时间 2019-01-22下午4:30 主讲 罗恒丰 地点 四楼电教室 版本:11.2 大小:2.06G 安装文件在专班ftp里python安装文件的文 ...

  4. java c3p0 存储过程_JAVA Spring 连接池 调用 Oracle 存储过程的问题?

    求助,JAVA Spring 连接池 调用 Oracle 存储过程的问题?在Spring中配置了c3P0的连接池,在调用Oracle的存储过程时,报错[code]java.lang.ClassCast ...

  5. Python使用cx_Oracle模块操作Oracle数据库详解

    本文实例讲述了Python使用cx_Oracle模块操作Oracle数据库.分享给大家供大家参考,具体如下: ORACLE_SID参数,这个参数是操作系统中用到的,它是描述我们要默认连接的数据库实例, ...

  6. net oracle连接池配置,Oracle ODP.NET连接池

    数据库连接池 连接池是数据库连接的缓存,每当应用程序需要连接数据库时向连接池申请数据库连接,连接池负责具体数据库连接的创建和销毁.连接池中的数据库连接会缓存一段时间,后续的连接请求首先使用缓存中的数据 ...

  7. jdbc链接mysql按照id查询_使用jdbc连接并操作Oracle数据库(增删改查IDUS)

    使用jdbc连接并操作Oracle数据库(增删改查IDUS) [oracle@zaibei-db ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Pro ...

  8. PLSQL无法连接64位Oracle数据库/Database下拉框为空的解决方法

    PLSQL无法连接64位Oracle数据库/Database下拉框为空的解决方法 参考文章: (1)PLSQL无法连接64位Oracle数据库/Database下拉框为空的解决方法 (2)https: ...

  9. jsp mysql oracle_Jsp 连接 mySQL、Oracle 数据库备忘

    Jsp 连接 mySQL.Oracle 数据库备忘 2009-12-15 16:47 Jsp 环境目前最流行的是 Tomcat5.0.Tomcat5.0 自己包含一个 Web 服务器,如果是测试,就没 ...

最新文章

  1. 多层感知机MLP常见的超参数有哪些?如果MLP模型对于数据集过拟合了,如何调整这些超参数来进行解决?
  2. 服务器信息采集协议,服务器信息采集
  3. 多项式拟合缺点_机器学习——机器学习算法优缺点综述
  4. Android应用自动更新功能的代码实现
  5. Oracle_高级功能(3) synonym和database link
  6. 【LaTeX】Lyx/LaTeX笔记01
  7. 使用.htaccess文件为站点文件夹设置密码保护
  8. Hive之 hive的三种使用方式(CLI、HWI、Thrift)
  9. 如何主持计算机教师座谈会,计算机学院召开期中教学评价教师座谈会和学生座谈会...
  10. springMVC与RESTful支持
  11. WinMM.dll 函数汇总
  12. 发那科机器人寄存器Ar_浅谈发那科机器人与TP参数之间的关系
  13. IT外包项目质量把控
  14. 2022 年江苏省职业院校技能大赛(中职) 网络搭建与应用赛项公开赛卷
  15. special effects - 星空宇宙背景特效
  16. 挂件巡检机器人_最近DIY的室内巡检机器人
  17. 用Java根据π/4=1-1/3+1/5-1/7...计算pi的值
  18. 【STM32H7教程】第72章 STM32H7的SPI总线基础知识和HAL库API
  19. Iris微服务框架_golang web框架_完整示例Demo
  20. AgileConfig 一个轻量级配置中心

热门文章

  1. [React] Web应用:Hello World
  2. 吴恩达机器学习笔记4-代价函数III(cost function)
  3. [WS]使用Axis发布简单的Web服务
  4. Android N在通知栏上实现直接回复消息
  5. android自己定义刷新类控件
  6. PL/SQL 游标
  7. Git 服务器镜像迁移 - 携带提交日志,tag,branch。。
  8. 百度eCharts体验
  9. CentOS 7 的初始化
  10. 分布式内存数据库 Geode