2017-12-03 96 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