用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
 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()这一过程对各方都是平等的,谁抢到就是谁的。如果要做个检查连接的方法,则我希望它获得队列的优先级要高与正常调用的的方法,这样就不会出现连接队列一直被正常调用的方法霸占着,而检查连接的方法却因为抢不到连接而不工作。看来这部分要在实现了可控优先级的队列后才能实现了。

时间: 2024-10-14 11:30:38

用python自定义实现db2的连接池的相关文章

python mysql Connect Pool mysql连接池 (201

 easy_install mysql-connector-python >>>import mysql.connector as conner >>> conn = conner.connect(user="root", passwd="kaimen", db="zentao", port=3306, pool_name = "mypool", pool_size = 3,) >&g

redis 连接池

redis是一个key-value存储系统,和memcached类似,支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set-有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集和差集及更丰富的操作,而且这些操作都说原子性的.在此基础上,redis支持各种不同的方式排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘

【转】【很全很新】C3P0 连接池和 DBUtils 配合事务使用总结

[转]https://blog.csdn.net/guozhaohui628/article/details/84793028 很久没用原生连接池,最近想写个小功能,结果发现很多地方不太懂,然后网上搜了半天的 c3p0 相关内容,全不符合我想要的.相同内容太多 而且没什么,所以我自己来总结下吧. 01 总结全文从以下来总结 连接池的作用,为什么要使用连接池书写自己的连接池,用于理解框架 c3p0 等连接池连接池框架 c3p0 使用连接池框架 c3p0 和 DBUtils 的配合使用配合事务的使用

Mysql 连接池

通常,如果我们的服务涉及到mysql的操作,当一个新的请求进来的时候,可以先连接mysql, 使用完之后再断开连接即可. 但这样做有个弊端,当请求量巨大时,会在瞬间有大量的数据库连接与断开操作,这是非常影响 mysql 性能的做法.此时,我们就需要使用Mysql连接池. 在 Python 服务中使用 Mysql 连接池 1.建立连接池,sqllib.py import pymysql from DBUtils.PooledDB import PooledDB import Config clas

自定义连接池(装饰者模式)

连接池概述: 管理数据库的连接, 作用: 提高项目的性能. 就是在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可. 所有的连接池必须实现一个接口 javax.sql.DataSource接口 获取连接方法: Connection getConnection() 归还连接的方法就是以前的释放资源的方法.调用connection.close(); 增强方法: 1.继承 2.装饰者模式(静态代理) 3.动态代理 装饰者模式: 使用步骤: 1.装饰者和被装饰者实现同一

python socketpool:通用连接池

简介 在软件开发中经常要管理各种“连接”资源,通常我们会使用对应的连接池来管理,比如mysql数据库连接可以用sqlalchemy中的池来管理,thrift连接可以通过thriftpool管理,redis-py中的StrictRedis实现本身就是基于连接池的,等等. 而今天介绍的socketpool是一个通用的python连接池库,通过它可以实现任意类型连接的管理,虽然不是很完美,但在一些找不到合适连接池实现.而又不想自己造轮子的时候使用起来会节省很多精力. 内部实现要点 这个类库的代码其实并

python 基础 10.0 nosql 简介--redis 连接池及管道

一. NOSQL 数据库简介 NoSQL 泛指非关系型的数据库.非关系型数据库与关系型数据库的差别 非关系型数据库的优势: 1.性能NOSQL 是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL 层的解析,所以性能非常高. 2.可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展. 关系型数据库的优势: 1. 复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询. 2.事务支持使得对于安全性能很高的数据访问要求得以实现.对于这两类数据

数据库连接池原理详解与自定义连接池实现

实现原理 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约.无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量.连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中. 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象.使

开发自定义Mysql连接池

使用第三方包 https://pypi.python.org/pypi/DBUtils tar -zxvf *.tar.gz * python3 setup.py build && python3 setup.py install import time import pymysql import threading from DBUtils.PooledDB import PooledDB, SharedDBConnection POOL = PooledDB(     creator=