门户
书籍
教程
论坛
问答
下载
签到
个人空间
帐号
自动登录
找回密码
密码
登录
立即注册
账号
自动登录
找回密码
密码
登录
立即注册
请绘制轨迹完成人机验证
由vaptcha提供技术支持
登录
注册
搜索
搜索
搜索
热搜
qml
quick
串口
输入中文
数据库
arm
百度地图
qt聊天
QT安装
安装
多窗口
中文乱码
聊天
局域网
鼠标
QT
图片
乱码
rs485通讯
多线程
android
多文档编辑器
本版
用户
本版
用户
【HUX】问题互助平台
博客
动态
好友
帖子
收藏
道具
勋章
任务
淘帖
动态
日志
相册
分享
记录
留言板
群组
门户
导读
排行榜
设置
我的收藏
退出
Qt开源社区
›
开放区(网友自由发帖区)
›
项目作品
›
Qt数据库应用12-通用数据库清理
发布主题
返回列表
Qt数据库应用12-通用数据库清理
0
回复
2849
查看
[复制链接]
liudianwu
当前离线
积分
2622
liudianwu
累计签到:7 天
连续签到:1 天
来源:
2022-2-23 09:06:13
显示全部楼层
|
阅读模式
## 一、前言
很多项目如果需要存储很多日志记录比如运行日志,时间长了记录数量非常多,数据库体积不断增大,对应数据库表的增删改查的效率不断降低,为了消除这几个影响,需要有一套机制,不断将早期的数据清理,清理的规则比如可以指定表名、字段名、时间范围等。
日志记录的清理一方面是为了保证查询效率,毕竟数据量大了明显影响查询速度,一方面也是为了节约磁盘存储空间,毕竟存储空间有限,尤其是嵌入式板子,容量一般不会很大,记录无限制的存储下去会不断增加磁盘空间的占用。
除了数据库记录的清理以外,还有个场景是文件的清理,比如视频监控系统存储了很多视频文件,为了保证磁盘空间的大小,需要不断清理不需要的早期的视频文件,以便腾出空间存储新的文件,相当于覆盖写入,这样就最大化的把磁盘空间利用起来,不会因为磁盘空间不够而导致的程序不能正常运行。
1. 可设置要清理的对应数据库连接名称和表名。
2. 可设置条件字段。
3. 可设置排序字段。
4. 可设置最大保留的记录数。
5. 可设置执行自动清理的间隔。
6. 后期支持多个数据库和多个表。
7. 建议条件字段用数字类型的主键,速度极快。
8. 增加统计用字段名称设置。
9. 增加自动清理文件夹,超过大小自动删除文件夹中早期文件。
关于Qt数据库相关开发的一些经验总结:
[
https://qtchina.blog.csdn.net/article/details/119022424
](
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
](
https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A
) 提取码:o05q 文件名:bin_dbtool.zip
2. 国内站点:[
https://gitee.com/feiyangqingyun
](
https://gitee.com/feiyangqingyun
)
3. 国际站点:[
https://github.com/feiyangqingyun
](
https://github.com/feiyangqingyun
)
4. 个人主页:[
https://blog.csdn.net/feiyangqingyun
](
https://blog.csdn.net/feiyangqingyun
)
5. 知乎主页:[
https://www.zhihu.com/people/feiyangqingyun/
](
https://www.zhihu.com/people/feiyangqingyun/
)
## 四、效果图
## 五、相关代码
```cpp
void frmDbClean:
n_btnOpen_clicked()
{
if (ui->btnOpen->text() == "打开数据库") {
DbInfo dbInfo;
dbInfo.connName = this->objectName();
dbInfo.dbName = AppConfig:
bName3;
dbInfo.hostName = AppConfig::HostName3;
dbInfo.hostPort = AppConfig::HostPort3;
dbInfo.userName = AppConfig::UserName3;
dbInfo.userPwd = AppConfig::UserPwd3;
QString dbType = AppConfig:
bType3.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:
n_btnCopy_clicked()
{
//将数据库设置参数一键粘贴过来
ui->cboxDbType->setCurrentIndex(ui->cboxDbType->findText(AppConfig:
ocalDbType));
ui->txtDbName->setText(AppConfig:
ocalDbName);
ui->txtHostName->setText(AppConfig:
ocalHostName);
ui->txtHostPort->setText(QString::number(AppConfig:
ocalHostPort));
ui->txtUserName->setText(AppConfig:
ocalUserName);
ui->txtUserPwd->setText(AppConfig:
ocalUserPwd);
}
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:
n_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();
}
```
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有帐号?
立即注册
x
回复
使用道具
举报
返回列表
发表新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
浏览过的版块
文章教程
影音多媒体
界面美化
公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满)
我知道了