我有一个c++代码,可以解析文件并根据这些文件的内容更新mysql数据库。我在Windows10中运行我的代码,MySQL5.7,我的基础使用innodb引擎。mysql调用是通过我自己的libmysql Package 器执行的。
为了优化此代码,我将更新请求附加到缓冲区中,直到达到缓冲区的最大大小,然后同时发送整个缓冲区(包含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(字符串请求)的实现基本上是:
void SendRequest(string Request)
{
mysql_query( SQLSocket, Request.c_str())
}
但是,在提交事务时,事务恰好已被破坏:mysql表示状态不适合提交。我也尝试过做同样的事情,但是一个接一个地发送请求,而这个错误在提交时不会发生。
所以,我的两个问题是:
你知道为什么一次发送多个请求会破坏我的交易吗?
你认为使用缓冲请求列表真的可以优化我的代码吗?
1条答案
按热度按时间w46czmvw1#
创建一个具有多个值的插入,而不是多个插入。听着,在循环之前
INSERT INTO TABLE (columns)
,然后在循环内追加(values),
对于每个值集。生成的sql语句类似于: