Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)通用數(shù)據(jù)庫清理
一、前言
很多項目如果需要存儲很多日志記錄比如運行日志,時間長了記錄數(shù)量非常多,數(shù)據(jù)庫體積不斷增大,對應(yīng)數(shù)據(jù)庫表的增刪改查的效率不斷降低,為了消除這幾個影響,需要有一套機制,不斷將早期的數(shù)據(jù)清理,清理的規(guī)則比如可以指定表名、字段名、時間范圍等。
日志記錄的清理一方面是為了保證查詢效率,畢竟數(shù)據(jù)量大了明顯影響查詢速度,一方面也是為了節(jié)約磁盤存儲空間,畢竟存儲空間有限,尤其是嵌入式板子,容量一般不會很大,記錄無限制的存儲下去會不斷增加磁盤空間的占用。
除了數(shù)據(jù)庫記錄的清理以外,還有個場景是文件的清理,比如視頻監(jiān)控系統(tǒng)存儲了很多視頻文件,為了保證磁盤空間的大小,需要不斷清理不需要的早期的視頻文件,以便騰出空間存儲新的文件,相當于覆蓋寫入,這樣就最大化的把磁盤空間利用起來,不會因為磁盤空間不夠而導(dǎo)致的程序不能正常運行。
- 可設(shè)置要清理的對應(yīng)數(shù)據(jù)庫連接名稱和表名。
- 可設(shè)置條件字段。
- 可設(shè)置排序字段。
- 可設(shè)置最大保留的記錄數(shù)。
- 可設(shè)置執(zhí)行自動清理的間隔。
- 后期支持多個數(shù)據(jù)庫和多個表。
- 建議條件字段用數(shù)字類型的主鍵,速度極快。
- 增加統(tǒng)計用字段名稱設(shè)置。
- 增加自動清理文件夾,超過大小自動刪除文件夾中早期文件。
Qt數(shù)據(jù)庫相關(guān)應(yīng)用開發(fā)總結(jié)
二、功能特點
同時支持多種數(shù)據(jù)庫比如odbc、sqlite、mysql、postgresql、sqlserver、oracle、人大金倉等。
一個數(shù)據(jù)庫類即可管理本地數(shù)據(jù)庫通信,也支持遠程數(shù)據(jù)庫通信等。
數(shù)據(jù)庫線程支持執(zhí)行各種sql語句,包括單條和批量。
組件中的所有類打印信息、錯誤信息、執(zhí)行結(jié)果都信號發(fā)出去。
集成數(shù)據(jù)庫通用翻頁類(負責具體處理邏輯),搭配分頁導(dǎo)航控件(負責外觀),形成超級牛逼的翻頁控件。
集成數(shù)據(jù)庫自動清理類,設(shè)定最大記錄數(shù)后臺自動清理早期數(shù)據(jù)。
集成自定義委托類,支持復(fù)選框、文本框、下拉框、日期框、微調(diào)框、進度條等。
同時支持Qt4-Qt6,親測Qt4.6到Qt6.3任意版本,任意系統(tǒng)和編譯器。
本組件無故障 360天7乘24小時 運行在至少上萬個現(xiàn)場,商業(yè)級別品質(zhì)保證。
每個類都對應(yīng)完整詳細的使用示例,注釋詳細,非常適合閱讀學(xué)習(xí)。
可以作為獨立的程序運行,比如自動清理早期數(shù)據(jù),同步數(shù)據(jù)到云端。
全部線程處理,不卡界面,自動重連數(shù)據(jù)庫。
普通測試情況,sqlite數(shù)據(jù)庫,數(shù)據(jù)庫發(fā)生器每秒鐘插入1000條記錄約0.003秒鐘,同時自動清理數(shù)據(jù)類每秒鐘刪除1000條記錄約0.13秒,不同線程互不干擾。
三、體驗地址
體驗地址:https://pan.baidu.com/s/15ZKAlptW-rDcNq8zlzdYLg 提取碼:uyes 文件名:bin_dbtool.zip
國內(nèi)站點:https://gitee.com/feiyangqingyun
國際站點:https://github.com/feiyangqingyun
四、效果圖

五、相關(guān)代碼
void frmDbClean::on_btnOpen_clicked()
{
if (ui->btnOpen->text() == "打開數(shù)據(jù)庫") {
DbInfo dbInfo;
dbInfo.connName = this->objectName();
dbInfo.dbName = AppConfig::DbName3;
dbInfo.hostName = AppConfig::HostName3;
dbInfo.hostPort = AppConfig::HostPort3;
dbInfo.userName = AppConfig::UserName3;
dbInfo.userPwd = AppConfig::UserPwd3;
QString dbType = AppConfig::DbType3.toUpper();
if (dbType == "SQLITE") {
dbInfo.dbName = DbHelper::getDbDefaultFile();
}
dbClean->setConnInfo(DbHelper::getDbType(dbType), dbInfo);
if (dbClean->openDb()) {
//dbClean->start();
ui->btnOpen->setText("關(guān)閉數(shù)據(jù)庫");
} else {
QString error = dbClean->getDatabase().lastError().text();
QUIHelper::showMessageBoxError("打開數(shù)據(jù)庫失敗!\n" + error, 3);
}
} else {
dbClean->stop();
dbClean->closeDb();
ui->btnOpen->setText("打開數(shù)據(jù)庫");
ui->btnStart->setText("啟動服務(wù)");
on_btnClear_clicked();
}
QTimer::singleShot(100, this, SLOT(getTables()));
QTimer::singleShot(1000, this, SLOT(on_btnStart_clicked()));
}
void frmDbClean::on_btnCopy_clicked()
{
//將數(shù)據(jù)庫設(shè)置參數(shù)一鍵粘貼過來
ui->cboxDbType->setCurrentIndex(ui->cboxDbType->findText(AppConfig::LocalDbType));
ui->txtDbName->setText(AppConfig::LocalDbName);
ui->txtHostName->setText(AppConfig::LocalHostName);
ui->txtHostPort->setText(QString::number(AppConfig::LocalHostPort));
ui->txtUserName->setText(AppConfig::LocalUserName);
ui->txtUserPwd->setText(AppConfig::LocalUserPwd);
}
void frmDbClean::getTables()
{
if (!dbClean->getOk()) {
return;
}
//取出數(shù)據(jù)庫對應(yīng)的表集合
QStringList tables = dbClean->getDatabase().tables();
ui->cboxTables->clear();
ui->cboxTables->addItems(tables);
if (tables.contains("LogInfo")) {
ui->cboxTables->setCurrentIndex(ui->cboxTables->findText("LogInfo"));
}
}
void frmDbClean::on_btnDo_clicked()
{
if (!dbClean->getOk()) {
return;
}
QString tableName = ui->cboxTables->currentText();
QString countName = ui->txtCountName->text();
QString orderSql = ui->txtOrderSql->text();
dbClean->setTableName(tableName);
dbClean->setCountName(countName);
dbClean->setWhereColumnName(countName);
dbClean->setOrderSql(orderSql);
//最大保留記錄數(shù)量
dbClean->setMaxCount(AppConfig::Count3 * 10000);
//清理間隔
dbClean->setCleanInterval(AppConfig::Interval3);
dbClean->cleanData();
}
到此這篇關(guān)于Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)通用數(shù)據(jù)庫清理的文章就介紹到這了,更多相關(guān)Qt數(shù)據(jù)庫清理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

