用python自定义实现db2的连接池

想要模仿zabbix的oracle插件orabix来实现对db2的监控,但是Java能力有限,就用python来实现了。但是python常用的连接池PooledDB似乎并不支持db2,一直报这样的错误:"Database module is not thread-safe."所幸我只是用来做监控的,要求并不是很高,只要实现连接池的两个基本功能即可:
1.连接复用
2.连接检查,重连

点击(此处)折叠或打开

  1. #!/usr/local/bin/python
  2. # -*- coding: utf-8 -*-

  3. import threading,ibm_db,time,Queue

  4. class db2pool(object):
  5.     def __init__(self,host,port,user,password,db,conn_num):
  6.         self.host=host
  7.         self.port=port
  8.         self.user=user
  9.         self.password=password
  10.         self.db=db
  11.         self.conn_num=conn_num
  12.         
  13.         self.conn_queue=Queue.Queue(0)
  14.                         
  15.         for i in range (0,self.conn_num):
  16.             try:
  17.                 conn=(ibm_db.connect("DATABASE="+self.db+";HOSTNAME="+self.host+";PORT="+self.port+";PROTOCOL=TCPIP;UID="+self.user+";PWD="+self.password+";", "", ""))
  18.                 self.conn_queue.put(conn)
  19.             except Exception as e:    
  20.                 print e
  21.     
  22.     def getconnect(self):
  23.             
  24.         for i in range (0,5):

  25.             if self.conn_queue.qsize()>0:
  26.                 conn=self.conn_queue.get()
  27.                 
  28.                 try:
  29.                     stmt=ibm_db.prepare(conn,"select 1 from sysibm.sysdummy1")
  30.                     ibm_db.execute(stmt)
  31.                     return conn
  32.                 except Exception as e:
  33.                     print e
  34.                     try:
  35.                         conn=(ibm_db.connect("DATABASE="+self.db+";HOSTNAME="+self.host+";PORT="+self.port+";PROTOCOL=TCPIP;UID="+self.user+";PWD="+self.password+";", "", ""))
  36.                         self.conn_queue.put(conn)
  37.                     except Exception as e:
  38.                         print e
  39.                 
  40.             time.sleep(0.5)
  41.                 
  42.         print "get connection error"
  43.             
  44.     def getclose(self,conn):        
  45.         self.conn_queue.put(conn)

  46. #example
  47. def work(pool,i):
  48.     # while True:
  49.     conn=pool.getconnect()
  50.     if conn:
  51.         try:
  52.             pass
  53.             stmt=ibm_db.prepare(conn,"select "+str(i)+" from sysibm.sysdummy1")
  54.             ibm_db.execute(stmt)
  55.             result=ibm_db.fetch_both(stmt)
  56.             while (result):
  57.                 print "\nresult[0]="+str(result[0])+"++++"+str(conn)
  58.                 result=ibm_db.fetch_both(stmt)
  59.         except Exception as e:
  60.             print e
  61.         finally:
  62.             pass
  63.             pool.getclose(conn)
  64.     time.sleep(5)

  65. if __name__=="__main__":
  66.     pool=db2pool("172.16.2.9","60000","db2inst1","db2inst1","secs",5)
  67.     for i in range (0,50):
  68.         t=threading.Thread(target=work,args=(pool,i,))
  69.         t.start()

因为我自己对python也不熟,这里有个地方我采用了妥协的办法:
我是在调用连接的时候去检查连接是否还存活着,而一般的情况下都是用一个后台的线程每隔一段时间去检查线程的。

我也尝试着这样去做了,但发现一个问题:获取连接队列 conn = self . conn_queue . get ( )这一过程对各方都是平等的,谁抢到就是谁的。如果要做个检查连接的方法,则我希望它获得队列的优先级要高与正常调用的的方法,这样就不会出现连接队列一直被正常调用的方法霸占着,而检查连接的方法却因为抢不到连接而不工作。看来这部分要在实现了可控优先级的队列后才能实现了。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20777547/viewspace-1849873/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20777547/viewspace-1849873/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值