我目前正在尝试在我的 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)