用python自定义实现db2的连接池
时间:2021-07-01 10:21:17
帮助过:2人阅读
#!/usr/local/bin/python
2 # -*- coding: utf-8 -*-
3
4 import threading,ibm_db,time,Queue
5
6 class db2pool(object):
7 def __init__(self,host,port,user,password,db,conn_num):
8 self.host=
host
9 self.port=
port
10 self.user=
user
11 self.password=
password
12 self.db=
db
13 self.conn_num=
conn_num
14
15 self.conn_queue=
Queue.Queue(0)
16
17 for i
in range (0,self.conn_num):
18 try:
19 conn=(ibm_db.connect(
"DATABASE="+self.db+
";HOSTNAME="+self.host+
";PORT="+self.port+
";PROTOCOL=TCPIP;UID="+self.user+
";PWD="+self.password+
";",
"",
""))
20 self.conn_queue.put(conn)
21 except Exception as e:
22 print e
23
24 def getconnect(self):
25
26 for i
in range (0,5
):
27
28 if self.conn_queue.qsize()>
0:
29 conn=
self.conn_queue.get()
30
31 try:
32 stmt=ibm_db.prepare(conn,
"select 1 from sysibm.sysdummy1")
33 ibm_db.execute(stmt)
34 return conn
35 except Exception as e:
36 print e
37 try:
38 conn=(ibm_db.connect(
"DATABASE="+self.db+
";HOSTNAME="+self.host+
";PORT="+self.port+
";PROTOCOL=TCPIP;UID="+self.user+
";PWD="+self.password+
";",
"",
""))
39 self.conn_queue.put(conn)
40 except Exception as e:
41 print e
42
43 time.sleep(0.5
)
44
45 self.logger.echo(
"warning",
"get connection error")
46
47 def getclose(self,conn):
48 self.conn_queue.put(conn)
49
50 #example
51 def work(pool,i):
52 # while True:
53 conn=
pool.getconnect()
54 if conn:
55 try:
56 pass
57 stmt=ibm_db.prepare(conn,
"select "+str(i)+
" from sysibm.sysdummy1")
58 ibm_db.execute(stmt)
59 result=
ibm_db.fetch_both(stmt)
60 while (result):
61 print "\nresult[0]="+str(result[0])+
"++++"+
str(conn)
62 result=
ibm_db.fetch_both(stmt)
63 except Exception as e:
64 print e
65 finally:
66 pass
67 pool.getclose(conn)
68 time.sleep(5
)
69
70 if __name__==
"__main__":
71 pool=db2pool(
"172.16.2.9",
"60000",
"db2inst1",
"db2inst1",
"secs",5
)
72 for i
in range (0,50
):
73 t=threading.Thread(target=work,args=
(pool,i,))
74 t.start()
因为我自己对python也不熟,这里有个地方我采用了妥协的办法:
我是在调用连接的时候去检查连接是否还存活着,而一般的情况下都是用一个后台的线程每隔一段时间去检查线程的。
我也尝试着这样去做了,但发现一个问题:获取连接队列conn=self.conn_queue.get()这一过程对各方都是平等的,谁抢到就是谁的。如果要做个检查连接的方法,则我希望它获得队列的优先级要高与正常调用的的方法,这样就不会出现连接队列一直被正常调用的方法霸占着,而检查连接的方法却因为抢不到连接而不工作。看来这部分要在实现了可控优先级的队列后才能实现了。
用python自定义实现db2的连接池
标签: