想要模仿zabbix的oracle插件orabix来实现对db2的监控,但是Java能力有限,就用python来实现了。但是python常用的连接池PooledDB似乎并不支持db2,一直报这样的错误:"Database module is not thread-safe."所幸我只是用来做监控的,要求并不是很高,只要实现连接池的两个基本功能即可:
1.连接复用
2.连接检查,重连
因为我自己对python也不熟,这里有个地方我采用了妥协的办法:
我是在调用连接的时候去检查连接是否还存活着,而一般的情况下都是用一个后台的线程每隔一段时间去检查线程的。
我也尝试着这样去做了,但发现一个问题:获取连接队列 conn = self . conn_queue . get ( )这一过程对各方都是平等的,谁抢到就是谁的。如果要做个检查连接的方法,则我希望它获得队列的优先级要高与正常调用的的方法,这样就不会出现连接队列一直被正常调用的方法霸占着,而检查连接的方法却因为抢不到连接而不工作。看来这部分要在实现了可控优先级的队列后才能实现了。
1.连接复用
2.连接检查,重连
点击(此处)折叠或打开
- #!/usr/local/bin/python
- # -*- coding: utf-8 -*-
-
- import threading,ibm_db,time,Queue
-
- class 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)
-
- print "get connection error"
-
- def getclose(self,conn):
- self.conn_queue.put(conn)
-
- #example
- def 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 ( )这一过程对各方都是平等的,谁抢到就是谁的。如果要做个检查连接的方法,则我希望它获得队列的优先级要高与正常调用的的方法,这样就不会出现连接队列一直被正常调用的方法霸占着,而检查连接的方法却因为抢不到连接而不工作。看来这部分要在实现了可控优先级的队列后才能实现了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20777547/viewspace-1849873/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/20777547/viewspace-1849873/