【发布时间】: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