2016-01-13 55 views
1

我正在爲一臺機器構建一個監控應用程序,位置必須在一個月內每秒鐘讀取和存儲。我寫了一個程序來填充一個具有初始0值的表格。機器監控應用程序(mysql)

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`(start_date datetime, end_date datetime) 
BEGIN 

DECLARE interval_var INT DEFAULT 1; 

    WHILE end_date >= start_date DO 

     INSERT INTO table1(datetime, value) VALUES(start_date, 0); 
     SET start_date = DATE_ADD(start_date, INTERVAL interval_var SECOND); 

    END WHILE; 

END 

這個過程非常慢,並且大部分時間與sql數據庫的連接丟失。例如,當我嘗試填寫表格「2016-01-14 07:00:00」到「2016-01-15 07:00:00」時,程序已達到2016-01-14 07:16:39以及由於與數據庫的連接丟失而墜毀。

是否有更有效的方法來創建一個月份的第二個增量和0值的模板表?我的監控應用程序建立在vb.net上,我試圖在vb上創建一個代碼來創建這個模板表,但它比mysql工作站上的直接過程更慢,更有可能崩潰。

+0

您應該可以使用準備好的查詢來完成此操作,該查詢旨在準備一次並運行多次。儘管你的存儲過程也應該這樣做。 – miken32

回答

0

我建議先看應用程序體系結構。期待整個系統在整個月內運行而不會失敗,甚至持續1秒,這是非常重要的。另外,試着想想如果你真的需要這麼多的數據。

1記錄/秒* 3600秒/小時* 24小時/天* 30天/月是超過310萬記錄。試圖處理這麼多的信息會導致很多軟件窒息。

如果測量結果是離散的,那麼只需記錄數據庫中的更改即可顯着降低測量結果。如果它是模擬的,你可能別無選擇。

我會建議創建兩個獨立的應用程序:本地監視器存儲本地數據,然後每小時左右報告給mysql服務器應用程序。這樣,如果數據庫不可用,它會保持正確的數據收集,並且當數據庫再次可用時,它可以傳輸自上次連接以來記錄的所有內容。然後,mysql應用程序可以一次性將數據存儲在數據庫中。如果失敗,它可以重試,並保留自己的數據副本,直到它被存儲到數據庫中。

例:

機=>監測站應用=> MySQL的應用程序=> mysql數據庫

這一點更多的工作,但每個應用程序將是相當小的,他們甚至可以重複使用。這將使故障排除變得更加容易,並大大提高系統的容錯能力。