2017-12-03 29 views
-1

我正在编写一个程序,它在接收到新数据时每隔几秒更新一次MySQL表。该函数有一个不断更新的无限循环,其内部的另一个循环遍历表行并相应地选择数据。MySQL准备好的语句没有在使用C++连接器的无限循环中清理

不幸的是,无论我做什么,我遇到的最可悲的错误:

Can't create more than max_prepared_stmt_count statements

我试着声明seen in the example code here每次迭代后,简单地删除所有MySQL相关的值(除CON和驱动程序)。

我已经尝试添加

stmt = NULL; 
stmt->close(); 

只是在每一个前值的情况。

我试着用auto_ptr重写程序,据说根据this的答案自动清理。

我甚至试图关闭和重建每次迭代后连接到MySQL服务器,但即使没有帮助我。

请帮忙。

+0

我不会说这是一个可悲的错误,限制在那里,所以你的记忆不会用完或减轻拒绝服务攻击。您始终可以增加限制,但即使对于持久应用程序,16,382个连接似乎也很多。 – Bradmage

+0

我的意思是它感到可怜得到它 – Roxerg

+1

哦,是的,是错误代码可以居高临下! – Bradmage

回答

1

有关您的循环的更多信息可能需要。

但它听起来像你stmt = con->createStatement();是你的循环中。在循环开始之前,您只需要一个连接。

然后你就可以在你的循环执行statment多次,res = stmt->executeQuery("SELECT 'Hello World!' AS _message");

当你的应用程序终止,那么你闭上你的语句,delete stmt;

从mysql.com“的默认值是16382。” mysql.com-sysvar_max_prepared_stmt_count这听起来像你只需要一个。

+0

我正在尝试这个吧!当我等待它崩溃或不崩溃时,还有一个问题 - 它是否可以与准备好的语句一起工作?如果我在循环之前声明语句,然后使用setInt/setString/etc。在每个executeQuery()之前,它会采用新的值并与它们一起运行吗? – Roxerg

+0

我会最终自己测试它,现在,这实际上工作,性能提高了10倍。谢谢你,我刚才一直在抨击我的头靠在墙上。 – Roxerg

+1

很高兴它的工作,有时你只需要外面的人看到问题。多年以来我一直没有使用C++,所以我不能给出具体的细节,但是在不同的语言中,mysql的工作原理基本相同。在说,你应该能够在循环之外做好准备,并且在循环中执行它,这就是它的目的。 – Bradmage