<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
隨著時間的增加,儲存的歷史記錄也在不斷增加,如果裝置數量很多,儲存間隔很短,不用多久,資料庫中的記錄就非常多,至少是百萬級別起步,而且有些使用者還是需要儲存每一次的採集的資料,這資料量別說一年,就是一個月下來都是恐怖級別的,所以這就涉及到一個重要的需求,如何自動清理早期的不需要的資料,比如只儲存最近10萬條記錄,或者儲存最近30天的記錄,這就需要安排個執行緒,線上程中開啟資料庫以後,每隔一段時間去查詢記錄數量,超過了設定的最大值,則按照時間順序把早期的資料刪除,其實就是執行一個sql語句。如果設定的是隻儲存最近30天的記錄,則每隔一段時間執行刪除sql語句,帶上條件where 時間<(今天-30)。由於是線上程中開啟的資料庫,所以線上程中執行的sql語句都不會對主介面使用的資料庫相關處理造成卡頓。
光有資料記錄清理可能還是不夠的,比如系統還不斷的在儲存報警圖片或者其他資料檔案,由於硬碟的大小有限,也需要一個機制做清理,尤其是對於視訊監控系統尤為重要。由於和資料庫記錄清理功能類似,而且資料庫清理執行緒99.99%的時間都是空餘的,就算是到了需要清理的時候,也是一次性清理多條,也不會頻繁的在清理中,為了不讓這個執行緒閒著,直接也把清理檔案的機制也放到了這個類,指定要監聽的目錄,指定最大的大小,每隔一段時間讀取下大小,超過了則清理早期的檔案。
裝置監控模組,包括資料監控(表格形式展示)、裝置面板(面板形式展示)、地圖監控(地圖形式展示)、曲線監控(曲線形式展示)。
資料查詢模組,包括報警記錄、執行記錄、操作記錄。
系統設定模組,包括基本設定、埠管理、控制器管理、探測器管理、報警聯動、型別設定等。
其他設定模組,包括使用者管理、地圖管理、位置調整、組態設計、裝置偵錯等。
國內站點:https://gitee.com/feiyangqingyun
國際站點:https://github.com/feiyangqingyun
體驗地址:https://pan.baidu.com/s/1foas7ytSXh7gHOTDqDREjQ 提取碼:axip 檔名:bin_iotsystem.zip。
int DbCleanThread::getCount() { int count = -1; if (!dbOk) { return count; } time.restart(); QString sql = QString("select count(%1) from %2").arg(countName).arg(tableName); QSqlQuery query(database); if (query.exec(sql)) { if (query.next()) { count = query.value(0).toInt(); QString msg = QString("(共 %1 條/用時 %2 秒)").arg(count).arg(getUseTime()); emit debug(QString("%1資料庫獲取記錄行數%2").arg(dbFlag).arg(msg)); emit receiveCount(tableName, count, time.elapsed()); } } return count; } QStringList DbCleanThread::getCleanValue(int cleanCount) { QStringList list; if (!dbOk) { return list; } QSqlQuery query(database); query.setForwardOnly(true); QString sql = DbHelper::getSelectCountSql(dbType, tableName, whereColumnName, "", orderSql, cleanCount); if (query.exec(sql)) { while (query.next()) { list << query.value(0).toString(); } } return list; } void DbCleanThread::cleanData() { if (!dbOk) { return; } //首先查詢總記錄數,如果總記錄數超過限制,則將超出的部分按照欄位排序進行刪除 int count = getCount(); int cleanCount = (count - maxCount); if (cleanCount < 100) { return; } time.restart(); //每次最大清理1000條資料 cleanCount = cleanCount > 1000 ? 1000 : cleanCount; //將要刪除的資料指定欄位集合查詢出來 QStringList list = getCleanValue(cleanCount); if (list.count() == 0) { return; } //刪除資料 QSqlQuery query(database); QString sql = QString("delete from %1 where %2 in(%3)").arg(tableName).arg(whereColumnName).arg(list.join(",")); dbOk = query.exec(sql); //qDebug() << TIMEMS << sql; QString msg = QString("(共 %1 條/用時 %2 秒)").arg(cleanCount).arg(getUseTime()); if (dbOk) { emit debug(QString("%1資料庫清理資料成功%2").arg(dbFlag).arg(msg)); } else { QString text = database.lastError().text(); emit error(QString("%1資料庫清理資料失敗%2, 原因: %3").arg(dbFlag).arg(msg).arg(text)); qDebug() << TIMEMS << this->objectName() << text; } } void DbCleanThread::cleanPath() { if (dirPath.isEmpty()) { return; } //找出該資料夾下的所有資料夾 QDir dir(dirPath); if (!dir.exists()) { return; } //按照目錄查詢,過濾資料夾,按照檔名稱排序 dir.setFilter(QDir::Dirs | QDir::NoSymLinks | QDir::NoDotAndDotDot); dir.setSorting(QDir::Name); QStringList list = dir.entryList(); //遍歷所有目錄,對所有檔案大小相加得到總大小,檔案就在資料夾下,不會再有子目錄 qint64 size = 0; foreach (QString path, list) { QDir d(dirPath + "/" + path); QFileInfoList infos = d.entryInfoList(dirFileFilter); foreach (QFileInfo info, infos) { size += info.size(); } //轉化成MB,超過預定大小自動刪除第一個資料夾,跳出迴圈無需繼續判斷 int sizeMB = size / (1024 * 1024); if (sizeMB >= dirMaxSize) { //刪除該目錄下的所有檔案 QString path = dirPath + "/" + list.at(0); QDir dir(path); dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); QStringList files = dir.entryList(); foreach (QString file, files) { dir.remove(file); qDebug() << TIMEMS << "刪除檔案" << path << file; } //刪除資料夾本身 dir.rmdir(path); QString msg = QString("(共 %1 個檔案/用時 %2 秒)").arg(files.count()).arg(getUseTime()); emit debug(QString("%1資料庫自動清理目錄成功%2").arg(dbFlag).arg(msg)); break; } } } void DbCleanThread::deletePath(const QString &path) { QDir dir(path); #if (QT_VERSION >= QT_VERSION_CHECK(5,0,0)) //這個方法可以遞迴徹底刪除資料夾 不管資料夾下是否有檔案 比較暴力 //此方法慎用 必須指定明確的資料夾 不然刪除預設的目錄哭都來不及 網上多個人中招 dir.removeRecursively(); #else //迴圈遍歷刪除檔案及資料夾 dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); QFileInfoList fileList = dir.entryInfoList(); foreach (QFileInfo fi, fileList) { if (fi.isFile()) { fi.dir().remove(fi.fileName()); } else { deletePath(fi.absoluteFilePath()); dir.rmpath(fi.absoluteFilePath()); } } //最後刪除最外層的目錄 dir.rmpath(path); #endif }
以上就是Qt物聯網管理平臺之實現自動清理早期資料功能的詳細內容,更多關於Qt自動清理資料的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45