与unixODBC,IBM DB2和pyodbc

时间:2015-11-16 22:43:32

标签: db2 odbc pyodbc unixodbc db2-400

tldr; 使用unixODBC进行Python-> DB2的工作设置,但连接池不起作用。

我尝试过直接使用驱动程序:

conn = pyodbc.connect('DRIVER=/opt/ibm/db2/lib/libdb2.so;Hostname=mydb2.domain.com;PORT=1234;DATABASE=database1;UID=user1;PWD=password1')

按驱动程序名称:

conn = pyodbc.connect('DRIVER=DB2;Hostname=mydb2.domain.com;PORT=1234;DATABASE=database1;UID=user1;PWD=password1')

DSN:

conn = pyodbc.connect('DSN=server1UID=user1;PWD=password1')

我一直在使用这个Python脚本来测试:

import sys
import timeit

#import pypyodbc as pyodbc
import pyodbc


#conn = pypyodbc.connect('DSN=server1;UID=user1;PWD=password1')
def query():
    try:
        conn = pyodbc.connect('DSN=server1;UID=user1;PWD=password1')
        cur = conn.cursor()
        cur.execute("select current timestamp from sysibm.sysdummy1")
        row = cur.fetchone()
        print('.', end='', flush=True)
        conn.close()
    except Exception as ex:
        print(ex, end='', flush=True)

t = timeit.Timer(query)
count = 50
duration = t.timeit(count)
print("\n{count} @ {duration}/sec".format(count=count, duration=count/duration))

(启用日志记录后,在odbcinst.ini中,它会显示每个查询的连接打开/关闭)

在我的开发环境中,上面的每秒约为10次查询

如果连接是在循环之外创建的,并且已缓存,那么~120 query / sec

如果我安装ibm_db_dbi并使用connect,结果大约是10个查询/秒,并使用pconnect ~60个查询/秒。

我也尝试了iODBC,但我根本无法连接它,而在Windows上,使用ODBC,连接池似乎按预期工作。

为什么unixODBC而不是ibm_db_dbi

  • connect无法合并
  • 网络中断后,
  • pconnect发生灾难性故障并且永远无法恢复。它也是缓存连接速度的一半。
  • pyodbc似乎比IBM驱动程序保持得更好。

设定:

  • Debian Jessie
  • Docker 1.7容器
  • 安装IBM DB2 ODBC v10.5库
  • unixODBC 2.3.4
  • Python 3.5
  • pyodbc 3.0.10

配置:

ODBCINST.INI

[ODBC]
Pooling         = Yes
Trace           = No
TraceFile       = /var/log/odbc.log

[DB2]
Description     = IBM DB2 Adapter
Driver          = /opt/ibm/db2/lib/libdb2.so
Driver64        = /opt/ibm/db2/lib/libdb2o.so
FileUsage       = 1
DontDLClose     = 1
CPTimeout       = 1000
CPTimeToLive    = 100
Threading       = 2
Pooling         = Yes

ODBC.INI

[server1]
Description    = Server 1
Driver         = DB2

db2cli.ini中

[server1]
Database      = database1
Protocol      = TCPIP
Hostname      = mydb2.domain.com
ServiceName   = 1234

参考文献:

1 个答案:

答案 0 :(得分:0)

看起来你的Pooling = Yes位置错误,需要在[ODBC]标题下,而不是标题

http://www.unixodbc.org/doc/conn_pool.html