gpt4 book ai didi

c++ - 如何使用 MySQL 连接器在 C++ 中防止打开文件过多

转载 作者:行者123 更新时间:2023-11-28 05:37:59 24 4
gpt4 key购买 nike

它显示错误代码:Can't create socket(24),在我调查后我知道已经达到open_files_limit,我检查了show global像 'open%' 这样的变量;在 MySQL 中,值是 5000000,所以我的代码一定有问题。

这是我的简单代码:

class DB {
public:
double query1();
double query2();
double query3();
};

main() {
DB handler;
for(int i=0;i<100000;i++) {
handler.query1();
handler.query2();
handler.query3();
}
}

我写了一个处理 3 查询的类并在循环中运行它,如何防止此类中的打开文件限制问题

这里是查询代码:

double query1(string pair) { 
double get_prob;
try {
/* Create a connection */
driver = get_driver_instance();
con = driver->connect("localhost", "root", "nlpgroup");
/* Connect to the MySQL test database */
con->setSchema("em_im");
stmt = con->createStatement();
stringstream stmvar;
stmvar << "select prob from em where pair='" << pair << "'";
string stmvarstr = stmvar.str();
cout << stmvarstr << endl;
res = stmt->executeQuery(stmvarstr); // replace with your statement
while (res->next()) {
get_prob = atof(res->getString(1).c_str());
}
res->close();
stmt->close();
con->close();

delete res;
delete stmt;
delete con;
} catch (sql::SQLException &e) {
cout << "# ERR: SQLException in " << __FILE__;
cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
cout << "# ERR: " << e.what();
cout << " (MySQL error code: " << e.getErrorCode();
cout << ", SQLState: " << e.getSQLState() << " )" << endl;
}
return get_prob;
}

最佳答案

show global variables like 'open%'; in MySQL

除了 MySQL,您的操作系统也可能施加限制。对于 Linux,请查看 /etc/security/limits.conf , 在 Windows 上,this答案可能会对您有所帮助。

但是,如果您经常一次又一次地需要同一个连接,打开它一次并保持打开状态直到您的程序终止可能是更好的选择。这还将为您提供更好的性能——并且您可以使用准备好的语句来进一步提高性能。我已经将其添加到下面的示例中......

class DB
{
std::unique_ptr <sql::Connection> con;
std::unique_ptr <sql::PreparedStatement> stmt;
public:
DB();
double query1(std::string const& pair);
};

DB::DB()
: con(get_driver_instance()->connect("localhost", "root", "nlpgroup"))
{
con->setSchema("em_im");
// you might prefer a prepared statement
stmt.reset(con->prepareStatement("SELECT prob FROM em WHERE pair = ?"));
}

double DB::query1(std::string const& pair)
{
double get_prob = 0.0;
try
{
stmt->setString(1, pair);
std::unique_ptr < sql::ResultSet > res(stmt->execute());
while (res->next())
{
get_prob = atof(res->getString(1).c_str());
}
}
catch(sql::SQLException& e)
{
/* ... */
}
return get_prob;
}

std::unique_ptr 的使用确保即使在出现异常的情况下也能正确删除所有对象 - 顺便说一句,您的代码没有。我没有明确地调用 close - 它无论如何都会在对象的析构函数中调用,所以这很好。

请注意,现在构造函数也可以抛出异常,因此您也需要在主函数中使用 try - catch。根据您的需要,您可以省略查询函数中的 try - catch。然而,这会改变行为:保持原样会导致所有查询都被执行,即使其中一个查询失败,而删除它会导致循环中止。

关于c++ - 如何使用 MySQL 连接器在 C++ 中防止打开文件过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37782030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com