我在c ++中有一个应用程序,我正在使用C ++ Mysql连接器(https://dev.mysql.com/downloads/connector/cpp/)
我需要在一个表中保存一些日志。根据时间的不同,我可能会有大量数据(例如,80,000)。
我已经实现了一个迭代std::vector<std::string>
并将std::string
保存到我的数据库的函数。
例如:
std::vector<std::string> lines = explode(filedata, '\n');
for (int i = 0; i < lines.size(); i++)
{
std::vector<std::string> elements = explode(lines[i], ';');
ui64 timestamp = strtol(elements.at(0).c_str(), 0, 10);
std::string pointId = elements.at(6);
std::string pointName = elements.at(5);
std::string data = elements.at(3);
database->SetLogs(timestamp, pointId, pointName, data);
}
日志来自csv文件,我将所有字段保存到我的矢量。在此之后,我解析向量(爆炸)并只获取我需要保存的字段。
但我有一个问题。如果我有80,000我正在调用我的函数来保存在数据库80,000中。它可以正常工作并保存所有数据,但需要花费很多时间。
存在某种方式保存所有数据只调用一次保存功能而不调用例如80,000,从而优化时间?
编辑1
我将插入代码更改为:
std::string insertLog = "INSERT INTO Logs (timestamp,pointId,pointName,data) VALUES (?,?,?,?)";
pstmt->setString(1, timestampString);
pstmt->setString(2, pointId);
pstmt->setString(3, pointName);
pstmt->setString(4, data);
pstmt->executeUpdate();
答案 0 :(得分:0)
您可以更改代码以执行批量插入,而不是一次插入一行。
我建议通过将insert语句生成为字符串并将字符串传递给mysqlpp::Query
来实现。我希望您可以使用预准备语句以类似的方式执行批量插入。
如果你为每一行做一个insert语句(我假设这里使用explode()
),我认为客户端和服务器之间的流量要大得多,这必然会减慢速度。
修改强>
我怀疑函数explode()
是为了增加执行时间,因为当你两次调用explode时你正在访问文件两次。如果你可以为explode()生成代码,那就太好了。