通过 ODBC 连接到 DB2 非常慢
Posted
技术标签:
【中文标题】通过 ODBC 连接到 DB2 非常慢【英文标题】:Connecting to DB2 through ODBC is extremely slow 【发布时间】:2014-09-11 13:05:00 【问题描述】:我在 Windows 7 系统 (x64) 上通过 ODBC 与本地 DB2 (v9.7 Express-C) 数据库的连接非常缓慢。我写了几个测试程序,每个程序都连接到本地数据库连续 100 次(不查询)并测量时间。结果是:
C++ x86 DB2/ODBC: 32 位 C++ 应用程序,通过 CDatabase
连接到本地 DB2 数据库C++ x86 DB2/ODBC: 相同同上,但 x64 应用程序PHP DB2/ODBC: 通过 odbc_connect
连接到本地 DB2 数据库。PHP MySQL/ODBC: 连接到本地 mysql 数据库,通过 odbc_connect
。JDBC DB2: Java 应用程序,使用 DB2 JDBC 驱动程序连接到本地 DB2 数据库。JDBC MySQL: Java应用程序,使用 MySQL JDBC 驱动程序连接到本地 MySQL 数据库。
我的第一个想法是我的 ODBC 配置有问题,但正如您所见,通过 ODBC 连接到 MySQL 数据库就像魅力一样。另一方面,使用 JDBC 驱动程序而不是 ODBC 连接到 DB2 也可以正常工作(尽管它仍然比 MySQL 慢很多)。
我找到了this related question,但它不适用于我。 任何有关可能导致此问题的原因以及如何解决的提示都会很棒!
补充问题: 通过 ODBC 连接到 DB2 数据库时,常见的连接时间是多少? DB2 ODBC驱动这么慢正常吗?!
【问题讨论】:
有了这几个细节,不可能给你任何有意义的答案,但你应该看的一件事是数据库激活。 DB2 在第一个连接时激活数据库,并在最后一个连接关闭时停用它。尝试在测试前发出ACTIVATE DB <YOURDB>
。
这有帮助!哇,谢谢,这几天我一直在努力解决这个问题!将其发布为答案,我会接受。您能否告诉我如何配置我的 DB2 实例,以便它在启动后始终激活该数据库?另外,为什么通过 JDBC 连接这么快? JDBC驱动不可能自己激活数据库,因为连接数据库的用户权限不足。
您能否提供激活数据库的连接时间值
@AngocA:发出ACTIVATE DB
后,php DB2/ODBC 的连接时间平均下降到 0,01390625 秒。 JDBC DB2 也快了一点,但比通过 ODBC 连接要慢:平均 0,035751759 秒。
【参考方案1】:
您应该查看的一件事是数据库激活。 DB2 在第一个连接时激活数据库,并在最后一个连接关闭时停用它。在激活期间,DB2 分配事务日志文件、内存池并执行许多其他需要时间的任务。
此行为不依赖于连接类型(ODBC 或 JDBC);您观察到的差异可能是由于在 JDBC 测试期间保持数据库处于活动状态的额外连接。
尝试在测试之前发出ACTIVATE DB <YOURDB>
,这样即使在没有连接的情况下也能保持数据库处于活动状态。默认情况下无法激活数据库,除了在系统启动时发出此命令,例如从批处理文件。
【讨论】:
以上是关于通过 ODBC 连接到 DB2 非常慢的主要内容,如果未能解决你的问题,请参考以下文章