用python自定义实现db2的连接池
来源:互联网 发布:淘宝店铺上架宝贝软件 编辑:程序博客网 时间:2024/05/17 05:53
手动迁移原创博客,原文发表在http://www.cnblogs.com/paololiu/p/5070749.html
想要模仿zabbix的oracle插件orabix来实现对db2的监控,但是Java能力有限,就用python来实现了。但是python常用的连接池PooledDB似乎并不支持db2,一直报这样的错误:"Database module is not thread-safe."所幸我只是用来做监控的,要求并不是很高,只要实现连接池的两个基本功能即可:
1.连接复用
2.连接检查,重连
#!/usr/local/bin/python# -*- coding: utf-8 -*-import threading,ibm_db,time,Queueclass db2pool(object): def __init__(self,host,port,user,password,db,conn_num): self.host=host self.port=port self.user=user self.password=password self.db=db self.conn_num=conn_num self.conn_queue=Queue.Queue(0) for i in range (0,self.conn_num): try: conn=(ibm_db.connect("DATABASE="+self.db+";HOSTNAME="+self.host+";PORT="+self.port+";PROTOCOL=TCPIP;UID="+self.user+";PWD="+self.password+";", "", "")) self.conn_queue.put(conn) except Exception as e: print e def getconnect(self): for i in range (0,5): if self.conn_queue.qsize()>0: conn=self.conn_queue.get() try: stmt=ibm_db.prepare(conn,"select 1 from sysibm.sysdummy1") ibm_db.execute(stmt) return conn except Exception as e: print e try: conn=(ibm_db.connect("DATABASE="+self.db+";HOSTNAME="+self.host+";PORT="+self.port+";PROTOCOL=TCPIP;UID="+self.user+";PWD="+self.password+";", "", "")) self.conn_queue.put(conn) except Exception as e: print e time.sleep(0.5) self.logger.echo("warning","get connection error") def getclose(self,conn): self.conn_queue.put(conn)#exampledef work(pool,i): # while True: conn=pool.getconnect() if conn: try: pass stmt=ibm_db.prepare(conn,"select "+str(i)+" from sysibm.sysdummy1") ibm_db.execute(stmt) result=ibm_db.fetch_both(stmt) while (result): print "\nresult[0]="+str(result[0])+"++++"+str(conn) result=ibm_db.fetch_both(stmt) except Exception as e: print e finally: pass pool.getclose(conn) time.sleep(5)if __name__=="__main__": pool=db2pool("172.16.2.9","60000","db2inst1","db2inst1","secs",5) for i in range (0,50): t=threading.Thread(target=work,args=(pool,i,)) t.start()
因为我自己对python也不熟,这里有个地方我采用了妥协的办法:
我是在调用连接的时候去检查连接是否还存活着,而一般的情况下都是用一个后台的线程每隔一段时间去检查线程的。
我也尝试着这样去做了,但发现一个问题:获取连接队列conn=self.conn_queue.get()这一过程对各方都是平等的,谁抢到就是谁的。如果要做个检查连接的方法,则我希望它获得队列的优先级要高与正常调用的的方法,这样就不会出现连接队列一直被正常调用的方法霸占着,而检查连接的方法却因为抢不到连接而不工作。看来这部分要在实现了可控优先级的队列后才能实现了。
0 0
- 用python自定义实现db2的连接池
- 用java实现DB2的自定义函数
- DB2学习笔记 --- python连接db2的connection方法参数
- python连接db2
- python连接db2
- SYBASE到DB2连接服务器的实现
- DB2字符串连接的实现过程
- 自定义连接池的实现;自定义连接池的问题,自定义连接池的优化,
- Tomcat4+jdk+db2连接池实现
- 自定义连接池实现
- python 连接db2 那些坑
- Python连接DB2数据库基本
- Python连接DB2操作的一个小例子
- db2的jdbc连接
- DB2的JDBC连接
- DB2字符串的连接
- db2递归实现字符串连接
- Python 连接db2 以及读取Excel 操作
- windows下不需要插件使用MyEclipse运行hadoop2.6.0 MapReduce程序。
- 运行时错误检查(/RTC)编译选项及实现原理
- 剑指offer面试题24:二叉搜索树的后序遍历序列
- 关于Java字符串中提取自己想要的数据进行计算
- [从头学数学] 第261节 Python实现数据结构:红黑树(RB Tree)
- 用python自定义实现db2的连接池
- Qt on_pushButton_clicked()的用法
- MongoDB备份恢复与导入导出
- 阿里面试题(不知真假)
- 关于appium测试框架的调研及使用
- 浅谈为什么Git没有取代SVN
- 获得表的ddl语句 以查看表结构
- Mac上常用的开发工具
- 转载自其它页面的内容