You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用clickhouse-cpp向含Map类型字段的ClickHouse表插入数据时遇system:115错误求助

使用clickhouse-cpp向含Map类型字段的ClickHouse表插入数据时遇system:115错误求助

我完全理解你折腾了好几个小时的烦躁,遇到system:115(对应EINPROGRESS,操作进行中)这种错误确实让人摸不着头脑,咱们一步步来拆解可能的问题:

首先先明确你的场景:你创建了一张带Map类型字段的MergeTree表:

CREATE TABLE test.map_table (
    tags Map(Int32, Int32)
) ENGINE = MergeTree() ORDER BY tuple();

但用clickhouse-cpp插入数据时,第一次插入后就触发了“Operation in progress”的系统错误。

结合clickhouse-cpp的常见问题,给你几个排查方向:

1. 异步操作未等待完成

如果你用了clickhouse-cpp的异步插入接口InsertAsync,而没有等待异步任务结束就发起下一次操作,就会触发EINPROGRESS错误。比如你可能写了类似这样的代码:

client.InsertAsync("test.map_table", {column});
// 立刻又执行插入或其他操作,没有等待异步任务完成

解决办法是必须等待异步future完成:

auto insert_future = client.InsertAsync("test.map_table", {column});
insert_future.wait(); // 等待插入操作彻底完成后再进行后续操作

2. Map类型列的构造方式错误

clickhouse-cpp对Map类型的序列化有特定要求,必须用ColumnMap来正确构造键值对集合,如果你手动拼接或者用了错误的列类型,可能导致插入过程卡住,进而触发后续操作的错误。正确的Map列构造示例:

#include <clickhouse/client.h>

using namespace clickhouse;

int main() {
    // 初始化客户端
    Client client(ClientOptions().SetHost("localhost"));

    // 创建Map类型的列:分别指定键列和值列的类型
    auto map_column = std::make_shared<ColumnMap>(
        std::make_shared<ColumnInt32>(),
        std::make_shared<ColumnInt32>()
    );

    // 向列中添加一行Map数据,比如 {1:100, 2:200}
    map_column->Append(
        ColumnInt32::Create({1, 2}),    // 键集合
        ColumnInt32::Create({100, 200}) // 值集合
    );

    // 执行插入
    client.Insert("test.map_table", {map_column});

    return 0;
}

3. 连接复用或资源未正确释放

如果你的代码中复用了客户端连接,但没有正确重置会话状态,或者存在未释放的列对象/资源,可能导致后续插入操作和前一次操作冲突。建议:

  • 确保每次插入操作完成后,相关的列资源都被正确释放(比如智能指针自动管理)
  • 如果是长连接场景,尝试在每次插入后调用client.Reset()重置会话(不过通常不需要,除非有特殊场景)

4. 版本兼容性问题

旧版本的clickhouse-cpp对Map类型的支持可能存在bug,或者与你的ClickHouse服务端版本不兼容。建议尝试升级clickhouse-cpp到最新的稳定版本,再测试插入操作。

如果以上排查都没解决问题,建议把你完整的插入代码片段贴出来,这样能更精准地定位问题~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 12:54:28