gpt4 book ai didi

c++ - MySQL 事务和缓冲的请求列表

转载 作者:行者123 更新时间:2023-11-29 17:30:15 25 4
gpt4 key购买 nike

我有一个 C++ 代码,可以解析文件并根据这些文件的内容更新 MySQL 数据库。我在 Windows 10 中运行我的代码,使用 MySQL 5.7,我的基础使用 InnoDB 引擎。 MySQL 调用是通过我自己的 libmysql 包装器执行的。

为了优化此代码,我将更新请求附加到缓冲区中,直到达到缓冲区的最大大小,然后同时发送整个缓冲区(包含 N 个更新)。整个过程是在单个事务内完成的。

这是我的代码的外观:

MySQLWrapper.StartTransaction();

string QueryBuffer = "";

// Element count is the number of elements parsed from the files
for( int i = 0 ; i < ElementCount ; ++i )
{
bool FlushBuffer =
( i> 0 && ! (( i + 1 ) % N) ) ||
( i == ElementCount - 1 ); // determines if we have reached the buffer max number of requests

QueryBuffer += "INSERT INTO mytable (myfield) VALUES (" Element[ i ] ");";

if( FlushBuffer )
{
MySQLWrapper.SendRequest( QueryBuffer );
QueryBuffer.assign("");
}
}
MySQLWrapper.Commit();

SendRequest(string Request) 的实现基本上是:

void SendRequest(string Request)
{
mysql_query( SQLSocket, Request.c_str())
}

但是,在提交事务时,事务恰好已被破坏:MySQL 指示状态不正确,无法提交。我尝试做同样的事情,但只发送一个请求,并且在提交时不会发生此错误。

所以,我的两个问题是:

  1. 您知道为什么一次发送多个请求会破坏我的交易吗?
  2. 您认为使用缓冲请求列表真的可以优化我的代码吗?

最佳答案

创建一个具有多个值的 INSERT,而不是多个 INSERT。 IOW,在循环之前,有INSERT INTO TABLE(列),然后在循环内,为每个值集附加(值),

MySQLWrapper.StartTransaction();

string QueryBuffer = "INSERT INTO mytable (myfield) VALUES ";

// Element count is the number of elements parsed from the files
for( int i = 0 ; i < ElementCount ; ++i )
{
bool FlushBuffer =
( i> 0 && ! (( i + 1 ) % N) ) ||
( i == ElementCount - 1 ); // determines if we have reached the buffer max number of requests

QueryBuffer += "(" Element[ i ] ")";
if( flushbuffer ) {
QueryBuffer += ";";
} else {
QueryBuffer += ",";
}

if( FlushBuffer )
{
MySQLWrapper.SendRequest( QueryBuffer );
QueryBuffer.assign("");
}
}
MySQLWrapper.Commit();

生成的 SQL 语句将类似于:

INSERT INTO mytable
(myfield)
VALUES
(1),
(2),
(3),
(3);

关于c++ - MySQL 事务和缓冲的请求列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50720077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com