0

我正在使用 libdbi 连接到一个大型 postgresql 数据库(3 亿条记录)并执行SELECT *查询,然后逐行显示结果。我正在获得完整的交换和内存,因此它似乎autocommit已启用并将整个结果集加载到内存中。是否有任何选项可以禁用自动提交或至少在提交后保持游标,就像ResultSet.HOLD_CURSORS_OVER_COMMIT在 java 中一样?我没有找到任何选择dbi_conn_set_option。这是我的代码:

dbi_conn conn;
dbi_result result;
int64_t id;

dbi_initialize(NULL);
conn = dbi_conn_new("pgsql");

if (conn == NULL)
{
    printf("connection error.\n");
return EXIT_FAILURE;
}

dbi_conn_set_option(conn, "host", "127.0.0.1");
dbi_conn_set_option(conn, "username", "postgres");
dbi_conn_set_option(conn, "password", "123456");
dbi_conn_set_option(conn, "dbname", "backup");

if (dbi_conn_connect(conn) < 0)
{
    printf("could not connect to database.\n");
    return EXIT_FAILURE;
}

result = dbi_conn_query(conn, "SELECT * FROM tbl");
if (result)
{
    while (dbi_result_next_row(result))
    {
        id = dbi_result_get_longlong(result, "_id");
        printf("This is _id: %ld\n", id);
    }

    dbi_result_free(result);
}

dbi_conn_close(conn);
dbi_shutdown();
4

1 回答 1

1

它与自动提交无关。

内存不足问题的解决方案确实是使用游标一次获取 N 个结果,而不是一步获取所有结果。

libdbi没有为 SQL 游标提供抽象,因此需要使用 SQL 查询来完成。

FETCH 上的文档页面在其示例中提供了完整的查询序列,显示了它是如何完成的。您需要在 C 中使用 libdbi 调用这些查询,其中包含两个循环:一个外部循环调用FETCH N from cursor_name,直到没有任何东西可以获取,一个内部循环处理该 FETCH 的结果,就像您当前的代码处理自身的结果一样select *

于 2012-08-07T14:07:54.580 回答