【发布时间】:2019-07-28 21:21:54
【问题描述】:
使用的东西:
图书馆:libpqxx:x64-windows version 6.4.4
操作系统:Windows 10
编译器:Visual C++ (MSVC)
这是我的 SQL 表:
CREATE TABLE test(
test_name VARCHAR(16)
);
这是我的简约测试版:
main.cpp
#include <pqxx/pqxx>
#include "test.h"
int main()
{
pqxx::connection database_connection("dbname = test user = postgres password = *****\
hostaddr = 127.0.0.1 port = 5432");
database_connection.prepare("insert_into_table", "INSERT INTO test \
VALUES ($1)");
test test(&database_connection);
system("pause");
}
test.h
#pragma once
#include <pqxx/connection.hxx>
#include <thread>
#include <array>
class test
{
public:
explicit test(pqxx::connection* database_connection);
void InsertData();
std::array<std::thread, 1> threads{};
pqxx::connection* database_connection;
};
test.cpp
#include "test.h"
#include <iostream>
#include <pqxx/transaction.hxx>
test::test(pqxx::connection* database_connection) : database_connection(database_connection)
{
for (auto& i : threads)
{
i = std::thread(&test::InsertData, this);
}
}
void test::InsertData()
{
pqxx::work work(*database_connection);
try
{
pqxx::result result = work.exec_prepared("insert_into_table", "test_data"); //prepared data in real project pqxx::binarystring blobs
work.commit();
}
catch (const std::exception& e) {
work.abort();
}
}
将 test.h 中的线程大小更改为大于 1 的结果。
注意:我必须使用准备好的 SQL 语句稍后将原始 bytea 数据插入到我的表中。
输出:
Exception thrown at 0x00007FFC2FF44008 in Project3.exe: Microsoft C++ exception : pqxx::usage_error at memory location 0x000000CEB00FF050.
Exception thrown at 0x00007FFC2FF44008 in Project3.exe: Microsoft C++ exception : pqxx::usage_error at memory location 0x000000CEB03FEF50.
Exception thrown at 0x00007FFC2FF44008 in Project3.exe: Microsoft C++ exception : pqxx::usage_error at memory location 0x000000CEB04FED30.
Exception thrown at 0x00007FFC2FF44008 in Project3.exe: Microsoft C++ exception : pqxx::usage_error at memory location 0x000000CEB02FEAF0.
Debug Error!
如何使用此 API 同时插入?
【问题讨论】:
-
线程是困难。确保正确同步访问。
-
你不能。 postgress 连接实际上是单线程的。如果要并行插入,每个线程必须打开自己的连接并使用它来插入数据。
标签: c++ postgresql concurrency libpqxx