为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
DM8
【操作系统】:
[root@a6a24934-8771-11ee-a476-000c29af87ae opt]# cat /etc/openEuler-release
openEuler release 20.03 (LTS-SP2)
【CPU】:
model name : Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
【问题描述】:
一:测试代码:
dhstmt hstmt;
rt = dpi_alloc_stmt(m_hcon, &hstmt);
printf("DEBUG: 00000000000000\n");
char pTest = "DELETE FROM user_info WHERE open_id = ? AND app_id = ?;";
rt = dpi_unbind_params(hstmt);
rt = dpi_prepare(hstmt, (sdbyte)pTest);
printf("DEBUG: 11111111111111\n");
问题: 该代码在CentOS Linux release 7.6.1810 (Core) 上能正常执行。但是在openEuler release 20.03 (LTS-SP2)上会卡在dpi_prepare调用里面,具体堆栈信息为:
Thread 1 (Thread 0x7fcf9b8df740 (LWP 994756) "dbi_test"):
#0 0x00007fcf9d58fddc in read () from /opt/sysroot64/lib/libpthread.so.0
#1 0x00007fcf9beb6fb9 in viosocket_recv () from /opt/mcu/modb/libdmdpi.so
#2 0x00007fcf9beb4c09 in data_recv_inet_once () from /opt/mcu/modb/libdmdpi.so
#3 0x00007fcf9beb57d7 in comm_inet_msg_recv_low () from /opt/mcu/modb/libdmdpi.so
#4 0x00007fcf9beb5ab8 in comm_inet_msg_recv () from /opt/mcu/modb/libdmdpi.so
#5 0x00007fcf9beb16aa in comm_msg_recv_with_memobj () from /opt/mcu/modb/libdmdpi.so
#6 0x00007fcf9beb178c in comm_msg_recv () from /opt/mcu/modb/libdmdpi.so
#7 0x00007fcf9be31fc2 in dpi_recv_msg () from /opt/mcu/modb/libdmdpi.so
#8 0x00007fcf9be35d76 in dpi_msg_inner () from /opt/mcu/modb/libdmdpi.so
#9 0x00007fcf9be36258 in dpi_msg () from /opt/mcu/modb/libdmdpi.so
#10 0x00007fcf9be96aa7 in dpi_prepare_inner () from /opt/mcu/modb/libdmdpi.so
#11 0x00007fcf9be96e13 in dpi_prepare () from /opt/mcu/modb/libdmdpi.so
#12 0x00007fcf9da9b068 in CDmDbHandlerImp::ConnecttoSrv(char const, char const*, char const*, char const*, unsigned short, unsigned short*) () from /opt/xxx/libxx.so
#13 0x00007fcf9da98e2e in CDBHandler::ConnecttoSrv(char const*, char const*, char const*, char const*, unsigned short) () from /opt/xxx/libxx.so
这个问题最终排查结果是公司安全策略网络对达梦数据库端口的部分消息做了拦截。如果有人遇到相同问题,供参考。
这个操作系统的版本是数据库所在的操作系统吗?数据库的版本呢?都一致吗?
此外程序使用的驱动是否是从数据库安装路径下dmdbms/driver获取的队友版本驱动?