MySQL 事务和缓冲的请求列表
MySQL transaction and buffered list of requests
我有一个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(字符串请求(的实现基本上是:
void SendRequest(string Request)
{
mysql_query( SQLSocket, Request.c_str())
}
但是,在提交事务时,事务恰好被破坏了:MySQL 指示提交状态不正确。我尝试做同样的事情,但发送请求 ony 一个,并且此错误在提交时不会发生。
所以,我的两个问题是:
- 你知道为什么一次发送多个请求会破坏我的交易吗?
- 你认为使用缓冲的请求列表真的可以优化我的代码吗?
不要创建多个 INSERT,而是创建一个具有多个值的 INSERT。IOW,在循环之前, 具有INSERT INTO TABLE (columns)
,然后在循环内,为每个值集追加(values),
。
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);
相关文章:
- Pybind11:将元组列表从Python传递到C++
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 如何在boost beast http请求中设置http头
- 发送一个带有libcurl C++问题的帖子请求:s
- 从网链套接字请求连接设备的列表
- MySQL 事务和缓冲的请求列表
- 请求参数列表的all_of
- 在std::unordered_set:上,请求一个具有默认散列的类型列表
- 在C++中修改 Google 云端硬盘文件列表请求参数