我有一个带有longblob字段的mysql表。我已成功将blob记录插入到表中,并使用python将它们提取回磁盘上的文件。
现在我想从表中选择最新版本的blob,并使用c ++和mysql连接器将其写入磁盘上的文件。这是我到目前为止的代码。
它似乎适用于较小的blob,但对于我的数据库中的大blob来说还不够。 最大缓冲区大小似乎接近1000000。
如何从mysql select中编写大型longblob文件?
string appname = "rocket.exe";
driver = get_driver_instance();
con = driver->connect(mysql_server, mysql_user, mysql_password);
con->setSchema("app");
stmt = con->createStatement();
sqlstring =
"select installer"
" from app_table"
" where appname = '" + appname + "'"
" order by version desc "
" limit 1";
std::istream *blob;
res = stmt->executeQuery(sqlstring);
while (res->next()) {
blob = res->getBlob("installer");
}
char buffer[1000000];
memset(buffer, '\0', 1000000);
blob->read((char*)buffer,1000000);
std::ofstream outfile ("rocket2.exe",std::ofstream::binary);
outfile.write (buffer,1000000);
outfile.close();
delete res; // resultset
delete stmt; // statement
delete con; // connection
答案 0 :(得分:2)
这是一个很大的缓冲区。您可能正在耗尽堆栈空间。通过添加一些内存管理或使用向量来分配给堆。你说你可以使用大约1000000.那里的可变性是由于其余的代码使用了堆栈空间。
#include <vector>;
std::vector<char> buffer(1000000, '\0');
blob->read(&buffer[0], buffer.size());
答案 1 :(得分:0)
定义缓冲区时:
std::vector<char> buffer(1000000, '\0');
blob->read(&buffer[0], buffer.size());