使用odbc驱动插入数据有时失败

【TDengine 使用环境】
预生产环境

【TDengine 版本】

3.3.6.9

【操作系统以及版本】

20.04.1-Ubuntu

【部署方式】容器部署

【遇到的问题:问题现象及影响】

我在linux下使用https://github.com/taosdata/taos-connector-odbc中实现的odbc c++连接器,在采用SQLBindParameter的方式实现数据批量插入,大部分插入操作是成功的,但有时插入时出现如下错误:

[freemine@yeah.net,yjshe@taosdata.com][TDengine ODBC Driver][/app/ap/ara-sysroot/usr/lib/libtaos_odbc.so]tsdb.c[905]:_execute(): General error:[taosc]Ref is not there SQL: INSERT INTO S2A_SUMDATA16_22_0 VALUES (?, ?, ?, ?, ?) ]

[freemine@yeah.net,yjshe@taosdata.com][TDengine ODBC Driver][/app/ap/ara-sysroot/usr/lib/libtaos_odbc.so]tsdb.c[905]:_execute(): General error:[taosc]Resource temporarily unavailable SQL: INSERT INTO S2A_SUMDATA2_4_31_0 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ]

我odbc连接是提前建好的,不会销毁重建。请问这些错误可能是什么原因? 还有这些错误会不会导致所在进程占用的CPU及内存增高?

使用的原生连接方式,还是 websocket 连接方式呢?

写入时底层链路报错“Ref is not there”,需要引擎组分析下

3.3.6.9版本有点老了,请先升级到 3.4.1.x的最新版本吧。

看你的日志输出,你使用的taos_connector_odbc版本可能也比较老了吧。
你可以把使用的taos_connector_odbc的版本也列一下

native方式

从哪里看taos_connector_odbc的版本?我找到:set_target_properties(taos_odbc PROPERTIES VERSION 0.1)

如果你是自己编译的话,那就git log -1,把commit串给我.

我们客户现在指定使用这个版本。

我下载的压缩包。还有别的办法不?

我们的客户指定是使用这个版本。

找到一个:commit 8dbcadc14f2ad946849cacd8f9295c3410c71cbe (HEAD → main, tag: ver-3.4.1.7, tag: ver-3.4.1.6, tag: ver-3.4.0.0)

从这个commit结合日志看,似乎同taos_connector_odbc没有关系。需要你确认如下:

  1. ODBC Connect后,connect Handle,你会一直持有直至程序退出?还是每次执行sql的时候,都是重新connect、prepare、bind、execute?
  2. 有没有显示/隐式使用odbc连接池?
  1. 程序启动时,调用SQLAllocHandle+SQLDriverConnect来创建多个SQLHDBC,程序退出时SQLDisconnect+SQLFreeHandle; 然后在插入输入时,使用一个前面创建的SQLHDBC,执行:SQLPrepare,BindColumnParameters,SQLExecute,结束时SQLFreeStmt。
  2. 如何查看显示/隐式使用odbc连接池?

那错误:

[freemine@yeah.net,yjshe@taosdata.com][TDengine ODBC Driver][/app/ap/ara-sysroot/usr/lib/libtaos_odbc.so]tsdb.c[905]:_execute(): General error:[taosc]Ref is not there SQL: INSERT INTO S2A_SUMDATA16_22_0 VALUES (?, ?, ?, ?, ?) ]

[freemine@yeah.net,yjshe@taosdata.com][TDengine ODBC Driver][/app/ap/ara-sysroot/usr/lib/libtaos_odbc.so]tsdb.c[905]:_execute(): General error:[taosc]Resource temporarily unavailable SQL: INSERT INTO S2A_SUMDATA2_4_31_0 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ]

是server端返回到客户端的?

大致可以确认,前后两次prepare/bind/execute中间相差多久?如果比较长,有可能会不会底层的taosc connection 被重置了。
这种场景,我没有测试过。
如果你确认是间隔会较长,那么我的一个临时建议如下:

  1. 有可能的话,在这个connect handle存活期间,通过间歇性在这个handle上执行’select 1’以期刷新底层(taosc/network-tcp)内部的’保活‘机制
  2. 或者,每次prepare/bind/execute执行业务代码之前,先执行一下’select 1’,过滤掉失活connect handle。

前后两次prepare/bind/execute间隔不超过100ms。出现这个错误之后,我代码中使用这个SQLHDBC采用SQL执行insert数据还会成功。

这样子的话,更像是底层taosc可以回答的问题了。或者换最新的taos和taos_connector_odbc,或者等taos的官方回复了。

好的,谢谢。

3.3.6.9 这个版本有点老,后续版本解决和优化了不少问题,建议升级到最新版本再验证。

好的,我试试。