使用 libpqxx for 批量存储数据或如何在 libpqxx 中使用 COPY 语句
Using libpqxx for to store data in bulk OR how to use COPY statement in libpqxx
要在PostgreSQL中插入批量数据/填充数据库,最快的方法是使用COPY。
我必须填充一个数据库。现在我的写入速度低至每秒 100-200。这涉及通过C++库libpqxx发送许多单独的插入。我想有两个原因是:
- 数据有许多重复记录。(我有原始日志,我解析并发送。这会导致主键异常。
- 逐个发送插入语句。
第一个不在我手中。但是,我正在阅读第二个。
据我所知,编表班适合这个目的。但是,它显然已被弃用。我已经读到可以使用 stdin 作为参数进行复制。
但是在这些线索之后,我迷失了。有人可以引导我找到解决方案吗?
编辑:这是代码,我有一个执行状态mnt的函数:
void pushLog(Log log,pqxx::connection *conn){
pqxx::work w(*conn);
std::stringstream stmt;
stmt<<"INSERT INTO logs VALUES('"<<log.getDevice()<<"','"<<log.getUser()<<"','"<<log.getDate()<<"','"<<log.getLabel()<<"');";
try{
pqxx::result res = w.exec(stmt.str());
w.commit();
}
catch(const std::exception &e){
std::cerr << e.what() << std::endl;
std::cout<<"Exception on statement:["<<stmt.str()<<"]n";
return;
}
}
我之前建立了连接,并传递了对它的引用。
PS:这个问题可能缺少一些细节。如果是这样,请发表评论,我将编辑并添加它们。
pushLog
函数单独提交每个插入,并且提交很慢。
如文档的填充数据库中所述:
如果允许单独提交每个插入,则 PostgreSQL 是 为添加的每一行做大量工作
也:
在一个事务中执行所有插入的另一个好处是 如果插入一行失败,则插入 到目前为止插入的所有行都将回滚,因此您不会 被部分加载的数据所困扰
但是,在您的情况下,这将是一个问题而不是好处,因为每个 INSERT 都可能在主键违规时失败,从而取消自上次提交以来的先前 INSERT。请注意,如果您使用它,这也将是COPY
的问题。
由于确实有必要对事务中的查询进行分组以提高性能,因此需要以不中止事务的方式处理主键冲突。
通常使用两种方法:
-
避免错误:
INSERT INTO... WHERE NOT EXISTS (SELECT 1 FROM table WHERE primary_key=...)
-
通过在 plpgsql 函数中插入一个忽略 itr 的 EXCEPTION 块来捕获错误。导致重复的特定插入将被取消,但事务不会中止。
如果您有并发插入,则需要使用锁定策略优化这些方法。
- std::filesystem::copy throws filesystem_error
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- 命名空间 pqxx 无法识别 - 将 libpqxx 添加到 Windows 上的 Visual Studio Post
- 通过libpqxx提高PostgreSQL数据库的更新速度
- 将"libpqxx"与Visual Studio 2013链接/安装,以便与PostgrSQL建立C++连接
- C++ 一个lambda浅拷贝const Type&如果它被赋予一个命名捕获,如[copy=val](){}?
- QML/C++/QObject Struct Copy
- C++赋值运算符,我们可以用 copy 替换它吗?
- 为什么我使用 std::copy() 收到运行时错误(分段错误)?
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- 如何使用 std::copy 当类有"无符号字符和运算符[]"时
- std::copy 导致运行时检查失败 #2
- 为什么 Clang 在命名空间'std'中没有名为 'copy' 的成员给出错误
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- 为什么使用 <uint8_t>MSVC 2015 编译器的 std::vector::insert 比 std::copy 快 5 倍?
- 如何将libpqxx库添加到cmake
- 对于输出,std::copy是否比std::cout快
- C++中的'deep copy'构造函数
- 复制初始化:为什么即使关闭了复制省略,也没有调用move或copy构造函数
- 使用 libpqxx for 批量存储数据或如何在 libpqxx 中使用 COPY 语句