C ++插入MySQl数据库

时间:2017-09-05 09:50:29

标签: c++ mysql

我在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();

1 个答案:

答案 0 :(得分:0)

您可以更改代码以执行批量插入,而不是一次插入一行。

我建议通过将insert语句生成为字符串并将字符串传递给mysqlpp::Query来实现。我希望您可以使用预准备语句以类似的方式执行批量插入。

如果你为每一行做一个insert语句(我假设这里使用explode()),我认为客户端和服务器之间的流量要大得多,这必然会减慢速度。

修改

我怀疑函数explode()是为了增加执行时间,因为当你两次调用explode时你正在访问文件两次。如果你可以为explode()生成代码,那就太好了。