小编Chr*_*ris的帖子

C++ Poco ODBC 事务 - 自动提交模式

我目前正在尝试在我的 C++ 应用程序中使用事务,但我对 ODBC 的自动提交模式有问题。

我正在使用 POCO 库在同一台机器上创建到 PostgreSQL 数据库的连接。目前,我可以将数据作为单个语句发送到这个数据库,但我无法理解如何使用 Poco 的事务库来更快地发送这些数据。

因为我有几千条记录要插入,所以继续使用单个插入语句非常慢且不切实际 - 所以我试图使用 Poco 的事务来加快速度(相当一点)。

我遇到的错误理论上是一个简单的错误 - Poco 抛出以下错误:

'Invalid access: Session is in auto commit mode.'
Run Code Online (Sandbox Code Playgroud)

我明白,因此,我应该以某种方式将“自动提交”设置为 false - 因为它只允许我将数据逐行提交到数据库,而不是作为单个事务提交。

问题是我如何设置它。

目前,我有一个从 Session.h 创建的会话,它看起来很像这样:

 session = new Poco::Data::Session(
                "ODBC",
                connection_data.str()
            );
Run Code Online (Sandbox Code Playgroud)

其中连接数据是一个简单的字符串流,包含登录信息、密码、数据库、服务器和“Driver={PostgreSQL ANSI};” 告诉 ODBC 使用 PostgreSQL 的驱动程序。

我曾尝试通过会话的 setFeature 或 setProperty 设置将属性“自动提交”设置为 false,当然,这无济于事。(此时更像是一次尝试)。

   session->setFeature("AUTOCOMMIT", false);
Run Code Online (Sandbox Code Playgroud)

环顾四周,我看到了一种可能的替代方法,即直接从 ODBC/session/SessionImpl.h 创建一个 ODBC sessionImpl 而不是使用上面的这个通用方法,然后从中创建一个新的会话对象。

这样做的好处是 ODBC 的 sessionImpl 在标头中引用了自动提交模式,这表明它能够处理这个问题:

void autoCommit(const std::string&, bool val);
    /// Sets autocommit property for …
Run Code Online (Sandbox Code Playgroud)

c++ sql postgresql odbc poco-libraries

3
推荐指数
1
解决办法
783
查看次数

标签 统计

c++ ×1

odbc ×1

poco-libraries ×1

postgresql ×1

sql ×1