跟踪 Informix Client for Linux 的 ODBC 调用

Posted

技术标签:

【中文标题】跟踪 Informix Client for Linux 的 ODBC 调用【英文标题】:Tracing ODBC calls for Informix Client for Linux 【发布时间】:2009-03-18 12:11:21 【问题描述】:

我试图从我在 Linux 上运行的程序中跟踪 ODBC 函数调用。该程序动态链接 ODBC 管理器,然后连接到数据库并获取一些数据。

我可以通过添加到 odbcinst.ini 来跟踪使用 unixODBC 的 ODBC 调用:

[ODBC]
Trace=yes
TraceFile=/tmp/sql.log

IBM 记录了此方法:Collecting data for an ODBC Problem

但是当我将管理器从 unixODBC 更改为 Informix 自己的管理器 (libifdmr.so) 时,不会创建跟踪文件。有人从 Linux 上的 Informix 管理器(和驱动程序)成功获取 ODBC 跟踪吗?

客户端版本:CSDK 3.50UC3

我希望这不是错误,我的配置有问题。

关于 unixODBC:我不能在多线程应用程序中使用 unixODBC。当断开连接来自另一个线程而不是连接时,我使用连接池并且我的应用程序出现段错误。在多线程应用程序中它也慢得多。

【问题讨论】:

我编辑的答案中有更多信息 - 但它看起来像一个错误,无论是在技术说明(FAQ)还是在产品(或两者)中。 【参考方案1】:

如果你运行:

strings $INFORMIXDIR/lib/cli/libifdmr.so | grep _OdbcSetTrace

你能看到任何参考资料吗?如果没有,则该库没有支持功能。如果您确实看到了这一点,那么概述的机制应该可以工作。如果没有,您可能有一个可报告的错误。

您试图追踪问题的级别是什么?而且,既然 unixODBC 有效,为什么不使用有效的驱动程序管理器呢?


我从 $INFORMIXDIR/demo/cli 中获取了示例 distsel.c,并使用 CSDK 3.50.FC3 在 Solaris 10 上对其进行了编译。我已经到了连接成功的地步,但是我正在使用的数据库中缺少表“项目”,因此程序停止了 SQLExecDirect()。当我在“truss”(相当于 Linux 上的“strace”)下运行它时,即使尝试打开跟踪文件,我也看不到代码的证据。

我编译使用:

gcc -I$INFORMIXDIR/incl/cli distsel.c -DNO_WIN32 \
    -L$INFORMIXDIR/lib/cli -lifdmr -lifcli -o distsel

我使用了以下 .odbc.ini 文件:

;
;  odbc.ini
;
[ODBC Data Sources]
odbc_demo = IDS 11.50.FC3 stores on black

[ODBC]
Trace           = yes
TraceFile       = /tmp/odbc.trace

[odbc_demo]
Driver          = /usr/informix/11.50.FC1/lib/cli/libifcli.so
Description     = IBM Informix CLI 3.50
Server          = black_19
FetchBufferSize = 99
UserName        = jleffler
Password        = XXXXXXXX
Database        = stores
ServerOptions   =
ConnectOptions  =
Options         =
ReadOnly        = no

还有这个:

;
;  odbc.ini
;
[ODBC Data Sources]
odbc_demo = IDS 11.50.FC3 stores on black

[odbc_demo]
Driver          = /usr/informix/11.50.FC1/lib/cli/libifcli.so
Description     = IBM Informix CLI 3.50
Server          = black_19
FetchBufferSize = 99
UserName        = jleffler
Password        = XXXXXXXX
Database        = stores
ServerOptions   =
ConnectOptions  =
Options         =
ReadOnly        = no
Trace           = yes
TraceFile       = /tmp/odbc.trace

因此,我相信您发现了一个错误。我不确定该错误是在您引用的常见问题解答中还是在产品中 - 我倾向于认为是后者。您应该将此问题报告给 IBM 技术支持。 (我没有检查过 Informix CLI (ODBC) 手册;在尝试提交产品错误之前可能值得检查一下;如果手册表明 Trace 不起作用,或者如果它没有表明它起作用工作,那么您列出的常见问题解答页面中有一个错误。)

如果您要查看 SQL 数据,FAQ 中的 SQLIDEBUG 部分有效:

SQLIDEBUG=2:distsel ./distsel

这为我生成了一个文件 distsel_6004_0_102d40 - 这对你来说会有所不同。然后,您可以使用“sqliprint”实用程序查看客户端和服务器之间的数据流动。

如果找不到“sqliprint”,请回复我。

【讨论】:

我在 libifdmr.so 中找到了 OdbcSetTrace。 (编辑问题中的更多信息) @Jonathan Leffler 我可以使用SQLIDEBUG,但找不到 sqliprint 命令 @cppcoder: CSDK 提供了一段时间。我没有检查它是否仍然提供,尽管我在 Mac OS X 上随 CSDK 3.70.FC6 一起分发了它。 @Jonathan Leffler 我有 Solaris 10。你的意思是我不能用我在 solaris 中创建的 sqlidebug 文件做任何事情吗? @cppcoder:不;我只是说我没有关于当前比赛状态的信息。您的 Solaris 机器上安装了哪个版本的 Informix 和 CSDK?你的PATH 上有$INFORMIXDIR/bin 吗?你在$INFORMIXDIR/bin 中查看过sqliprint 吗? $INFORMIXDIR/etc 中的文件列表是否列出sqliprint(您可以与grep sqliprint $INFORMIXDIR/etc/*files 核对)?你有多个可以看的地方吗?等等。【参考方案2】:

我在 odbc.ini 中使用这些设置获得了 ODBC 跟踪:

[ODBC]
TRACE=1
TRACEFILE=/tmp/odbc_trace.txt
TRACEDLL=idmrs09a.so

我从 IBM Informix ODBC Driver Programmer's Manual Version 3.50 复制了它们。 因此,当这些设置位于 odbc.ini 而不是 odbcinst.ini 中时,其他 IBM 文档似乎无效,您必须设置“为 ODBC 问题收集数据”文档中未提及的 TRACEDLL。

更新: 似乎 IBM 更改了文档:有关于 TRACEDLL 的信息,但 odbcinst.ini 仍然存在。

【讨论】:

以上是关于跟踪 Informix Client for Linux 的 ODBC 调用的主要内容,如果未能解决你的问题,请参考以下文章

快照启动后:Informix Client -23101 / Oracle Instant Client -28759

什么是informix for mysql now() 中的replace 函数

Informix for .NET 的连接字符串

informix提示初始化共享内存失败:shared memory not initialized for INFORMIXSERVER 'itellin_online'

无法在 linux 机器上通过 ODBC 连接到 informix

在 Informix 10 中检索或删除带有 blob 的行