一、前言

很多项目如果需要存储很多日志记录比如运行日志,时间长了记录数量非常多,数据库体积不断增大,对应数据库表的增删改查的效率不断降低,为了消除这几个影响,需要有一套机制,不断将早期的数据清理,清理的规则比如可以指定表名、字段名、时间范围等。

日志记录的清理一方面是为了保证查询效率,毕竟数据量大了明显影响查询速度,一方面也是为了节约磁盘存储空间,毕竟存储空间有限,尤其是嵌入式板子,容量一般不会很大,记录无限制的存储下去会不断增加磁盘空间的占用。

除了数据库记录的清理以外,还有个场景是文件的清理,比如视频监控系统存储了很多视频文件,为了保证磁盘空间的大小,需要不断清理不需要的早期的视频文件,以便腾出空间存储新的文件,相当于覆盖写入,这样就最大化的把磁盘空间利用起来,不会因为磁盘空间不够而导致的程序不能正常运行。

  1. 可设置要清理的对应数据库连接名称和表名。
  2. 可设置条件字段。
  3. 可设置排序字段。
  4. 可设置最大保留的记录数。
  5. 可设置执行自动清理的间隔。
  6. 后期支持多个数据库和多个表。
  7. 建议条件字段用数字类型的主键,速度极快。
  8. 增加统计用字段名称设置。
  9. 增加自动清理文件夹,超过大小自动删除文件夹中早期文件。

关于Qt数据库相关开发的一些经验总结:

https://qtchina.blog.csdn.net/article/details/119022424

二、功能特点

  1. 同时支持多种数据库比如odbc、sqlite、mysql、postgresql、sqlserver、oracle、人大金仓等。
  2. 一个数据库类即可管理本地数据库通信,也支持远程数据库通信等。
  3. 数据库线程支持执行各种sql语句,包括单条和批量。
  4. 组件中的所有类打印信息、错误信息、执行结果都信号发出去。
  5. 集成数据库通用翻页类(负责具体处理逻辑),搭配分页导航控件(负责外观),形成超级牛逼的翻页控件。
  6. 集成数据库自动清理类,设定最大记录数后台自动清理早期数据。
  7. 集成自定义委托类,支持复选框、文本框、下拉框、日期框、微调框、进度条等。
  8. 同时支持Qt4-Qt6,亲测Qt4.6到Qt6.3任意版本,任意系统和编译器。
  9. 本组件无故障 360天7乘24小时 运行在至少上万个现场,商业级别品质保证。
  10. 每个类都对应完整详细的使用示例,注释详细,非常适合阅读学习。
  11. 可以作为独立的程序运行,比如自动清理早期数据,同步数据到云端。
  12. 全部线程处理,不卡界面,自动重连数据库。
  13. 普通测试情况,sqlite数据库,数据库发生器每秒钟插入1000条记录约0.003秒钟,同时自动清理数据类每秒钟删除1000条记录约0.13秒,不同线程互不干扰。

三、体验地址

  1. 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_dbtool.zip
  2. 国内站点:https://gitee.com/feiyangqingyun
  3. 国际站点:https://github.com/feiyangqingyun
  4. 个人主页:https://blog.csdn.net/feiyangqingyun
  5. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/

四、效果图

五、相关代码

void frmDbClean::on_btnOpen_clicked()
{
if (ui->btnOpen->text() == "打开数据库") {
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("关闭数据库");
} else {
QString error = dbClean->getDatabase().lastError().text();
QUIHelper::showMessageBoxError("打开数据库失败!\n" + error, 3);
}
} else {
dbClean->stop();
dbClean->closeDb();
ui->btnOpen->setText("打开数据库");
ui->btnStart->setText("启动服务");
on_btnClear_clicked();
} QTimer::singleShot(100, this, SLOT(getTables()));
QTimer::singleShot(1000, this, SLOT(on_btnStart_clicked()));
} void frmDbClean::on_btnCopy_clicked()
{
//将数据库设置参数一键粘贴过来
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;
} //取出数据库对应的表集合
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); //最大保留记录数量
dbClean->setMaxCount(AppConfig::Count3 * 10000);
//清理间隔
dbClean->setCleanInterval(AppConfig::Interval3);
dbClean->cleanData();
}

Qt数据库应用12-通用数据库清理的更多相关文章

  1. SQL Server中通用数据库角色权限处理

    SQL Server中通用数据库角色权限处理   最近和同事在做数据库权限清理的事情,主要是删除一些账号:取消一些账号的较大的权限等,例如,有一些有db_owner权限,我们取消账号的数据库角色db_ ...

  2. [转]DbHelper通用数据库访问帮助类

    之前我一直都是在博客园中查看各位高手的博文,确实学到了不少知识,不过比较少写博客,现在就把我自己在项目实施过程中使用到比较好的技术框架写出来,希望能让更多的人了解和学习. 通常我们在开发使用数据库访问 ...

  3. SQL Server中通用数据库角色权限的处理详解

    SQL Server中通用数据库角色权限的处理详解 前言 安全性是所有数据库管理系统的一个重要特征.理解安全性问题是理解数据库管理系统安全性机制的前提. 最近和同事在做数据库权限清理的事情,主要是删除 ...

  4. DataAccess通用数据库访问类,简单易用,功能强悍

    以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...

  5. 通用数据库操作类,前端easyui-datagrid,form

    实现功能:     左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[ ...

  6. Qt for Android 打包 SQLite 数据库

    Qt for Android 调用 SQLite 数据库时, 怎样将已经存在的数据库附加到 APK 中? 直接在你项目里面的Android源码的根目录下新建一个文件夹assets, 数据库就可以放里面 ...

  7. 一个通用数据库访问类(C#,SqlClient)

    本文转自:http://www.7139.com/jsxy/cxsj/c/200607/114291.html使用ADO.NET时,每次数据库操作都要设置connection属性.建立connecti ...

  8. C# 通用数据库配置界面,微软原生DLL重整合

    C# 通用数据库配置界面,微软原生DLL重整合 自己整合了 微软自带的数据连接配置界面对话库    Microsoft.Data.ConnectionUI.Dialog.dll  微软自带的数据连接配 ...

  9. VB通用数据库操作方法

    1.VB通用数据操作方法. 2.通用数据库查询方法. 3.通用数据库操作方法. 'ERP查询数据库 Public Function YZQuery(sqls As String, msgstring ...

  10. DB2通用数据库性能调整的常用方法

    DB2通用数据库性能调整的常用方法 DB2通用数据库性能调整的常用方法 Agenda 统计值更新--runstats  调整Buffer pool  调整日志缓冲区大小  应用程序堆大小  排序堆大小 ...

随机推荐

  1. 使用AndroidStudio开发cocos2d-x,以及可能会出现的问题

    1. 使用AndroidStudio开发cocos2d-x流程 1.1 通过cocos2d-x官网(https://www.cocos.com/)下载cocos2d-x文件 1.2 安装python环 ...

  2. 4:Exchange安装后的任务

    4:Exchange安装后的任务 安装后的任务: 第一:证书的申请安装,分配服务略 注意项:如果是通配符证书,不能直接分配pop的服务              第二:虚拟目录的配置  Exchang ...

  3. Windows 11安装跳过联网

    方案1 在选择WIFI联网的界面,不要连接网络. Shift + F10(或者Fn+Shift+F10),打开cmd窗口,输入命令:oobe\BypassNRO.cmd 重启后会有一个我没有互联网的选 ...

  4. Andrew 算法求凸包

    Andrew 算法求凸包 参考资料: 右手定则(baidu.com) 内积和外积 - OI Wiki (oi-wiki.org) \(a\) 与 \(b\) 相对位置 \(b\) 在 \(a\) 的逆 ...

  5. duxapp放弃了redux,在duxapp中局部、全局状态的实现方案

    全局状态 全局状态是一个很实用的功能,例如管理用户信息,组件间状态共享等功能都需要用到全局状态,react有很多成熟的全局状态管理工具,但是很多写起来太过麻烦,duxapp提供了几种应对不同场景的全局 ...

  6. AT开发HTTP应用:Air780EP低功耗4G模组

    ​ 已经写了一篇基于Air780EP模组AT开发的FOTA远程升级指南,有客户朋友询问能否讲讲HTTP应用部分?本期特别安排--涵盖HTTP基本应用流程.GET/POST/SSL请求示例.断点续传.常 ...

  7. gal game 杂谈——《GINKA》

    gal game 杂谈--<GINKA> 剧情梳理 Ps:女主分为小学阶段和高中阶段,这里称小学阶段为小时候的女主,高中阶段为大女主,分离出来爱的为GINKA(长相是小时候的女主). 1. ...

  8. ubuntu 下做反向代理给hyperf使用

    使用hyperf的时候发现它监听9501端口,然后这样需要ip+port方式去访问,但是这样对用户而言有点不太友好,如果我们还有域名,可以做一个反向代理避免端口直接写出来. 找了找网上别人写的例子,感 ...

  9. 强化学习算法中log_det_jacobian的影响是否需要考虑

    相关: 人形机器人-强化学习算法-PPO算法的实现细节是否会对算法性能有大的影响. https://openi.pcl.ac.cn/devilmaycry812839668/google_brax_p ...

  10. Java GC 调试手记

    摘要 本文记录GC调试的一次实验过程和结果. GC知识要点回顾 问题1:为什么要调试GC参数?在32核处理器的系统上,10%的GC时间导致75%的吞吐量损失.所以在大型系统上,调试GC是以小博大的不错 ...