【问题标题】:C++ Poco ODBC Transactions - AutoCommit modeC++ Poco ODBC 事务 - 自动提交模式
【发布时间】:2017-01-16 11:04:49
【问题描述】:

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

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

由于我有几千条记录要插入,因此继续使用单个插入语句非常缓慢且不切实际 - 所以我正在尝试使用 Poco 的事务来加快速度(公平一点)。

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

'Invalid access: Session is in auto commit mode.'

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

问题是我如何设置它。

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

 session = new Poco::Data::Session(
                "ODBC",
                connection_data.str()
            );

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

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

   session->setFeature("AUTOCOMMIT", false);

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

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

void autoCommit(const std::string&, bool val);
    /// Sets autocommit property for the session.

但是,之前没有使用过 sessionImpl,我无法保证这是否可行,或者是否可以使用有限的可用文档。

我正在使用 C++ 03(不是 11)和 Visual Studio 2015 波科 1.7.5 提升(在需要时)

有人知道设置此功能的正确方法(上图)或实现此功能的替代方法吗?

【问题讨论】:

    标签: c++ sql postgresql odbc poco-libraries


    【解决方案1】:

    编辑:查看 poco 的来源,位于:

    https://github.com/pocoproject/poco/blob/develop/Data/ODBC/src/SessionImpl.cpp#L153

    该属性似乎被命名为autoCommit,并且正在查看

    https://github.com/pocoproject/poco/blob/develop/Data/include/Poco/Data/AbstractSessionImpl.h#L120

    属性名称的大小写似乎很重要。那么,如果你使用session->setFeature("autoCommit", false);,会有帮助吗?


    你不能在对应的 Session 对象上调用session->begin();session->end(); 吗?

    session->canTransact()返回什么?

    根据文档begin()将开始一个新的事务,文档没有提到任何需要在之前或之后设置的属性。

    见:https://pocoproject.org/docs/Poco.Data.Session.html

    【讨论】:

    • 是的,我可以调用 session->begin(),但它也会抛出“无效访问:会话处于自动提交模式。”以及。 - canTransact() 的结果是 1,我尝试使用它来保护 session->begin()。
    • 抱歉,没有从您的问题中得到答案。我猜你也已经尝试过使用 Poco Transaction 类了?
    • 你是对的,我也尝试过创建一个 Poco 事务类。我目前正在尝试自己直接创建一个 ODBC SessionImpl 对象,并尝试以这种方式解决它。
    • @Chris:我已经更新了我的答案,浏览 poco 源代码显示该属性名为“autoCommit” - 也没有帮助?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多