创意品牌网站徐州微网站开发

张小明 2026/1/12 7:56:41
创意品牌网站,徐州微网站开发,杭州企业自助建站系统,丽水建设网站制作Qt 实现 SQLite 连接池#xff08;线程安全版#xff09; SQLite 本身支持多线程#xff0c;但单个连接不能被多线程同时使用#xff0c;因此连接池的核心是#xff1a;管理一组独立的数据库连接#xff0c;为每个线程分配 / 复用连接#xff0c;保证线程安全#xff…Qt 实现 SQLite 连接池线程安全版SQLite 本身支持多线程但单个连接不能被多线程同时使用因此连接池的核心是管理一组独立的数据库连接为每个线程分配 / 复用连接保证线程安全避免频繁创建 / 销毁连接的性能损耗。以下是完整的连接池实现包含「单例模式、线程安全、连接有效性检查、最大连接数限制」核心特性1. 头文件SqliteConnectionPool.hcpp运行#ifndef SQLITECONNECTIONPOOL_H #define SQLITECONNECTIONPOOL_H #include QSqlDatabase #include QStack #include QMutex #include QString #include QWaitCondition // SQLite 连接池单例模式 线程安全 class SqliteConnectionPool { public: // 获取单例实例C11 线程安全的局部静态变量 static SqliteConnectionPool getInstance(); // 获取数据库连接若空闲连接不足则创建新连接超出最大数则等待 QSqlDatabase getConnection(); // 归还数据库连接到连接池 void releaseConnection(const QSqlDatabase db); // 设置连接池配置 void setConfig(const QString dbPath, int maxConn 10); // 释放所有连接析构时自动调用 void releaseAllConnections(); private: // 私有构造/析构禁止拷贝/赋值单例约束 SqliteConnectionPool(); ~SqliteConnectionPool(); SqliteConnectionPool(const SqliteConnectionPool) delete; SqliteConnectionPool operator(const SqliteConnectionPool) delete; // 检查连接是否有效执行简单 SQL 验证 bool isConnectionValid(const QSqlDatabase db); // 创建新的数据库连接 QSqlDatabase createNewConnection(); private: QMutex m_mutex; // 线程安全锁 QWaitCondition m_cond; // 等待条件无空闲连接时阻塞 QStackQString m_freeConnNames; // 空闲连接名称栈QSqlDatabase 按名称管理 QString m_dbPath; // SQLite 数据库文件路径 int m_maxConn 10; // 最大连接数默认10 int m_curConn 0; // 当前已创建的连接数 const QString m_connPrefix SqliteConn_; // 连接名称前缀保证唯一性 }; #endif // SQLITECONNECTIONPOOL_H2. 源文件SqliteConnectionPool.cppcpp运行#include SqliteConnectionPool.h #include QSqlQuery #include QDebug #include QThread // 单例实例获取 SqliteConnectionPool SqliteConnectionPool::getInstance() { static SqliteConnectionPool instance; return instance; } // 构造函数私有 SqliteConnectionPool::SqliteConnectionPool() { // 注册 SQLite 驱动Qt 5 自动注册此处兼容低版本 qRegisterMetaTypeQSqlDatabase(QSqlDatabase); } // 析构函数私有 SqliteConnectionPool::~SqliteConnectionPool() { releaseAllConnections(); } // 设置连接池配置数据库路径 最大连接数 void SqliteConnectionPool::setConfig(const QString dbPath, int maxConn) { QMutexLocker locker(m_mutex); m_dbPath dbPath; m_maxConn qMax(1, maxConn); // 最大连接数至少为1 } // 获取数据库连接 QSqlDatabase SqliteConnectionPool::getConnection() { QMutexLocker locker(m_mutex); // 步骤1优先使用空闲连接 while (m_freeConnNames.isEmpty()) { // 空闲连接为空时判断是否可创建新连接 if (m_curConn m_maxConn) { // 创建新连接 createNewConnection(); } else { // 超出最大连接数等待其他线程归还连接超时30秒 if (!m_cond.wait(m_mutex, 30000)) { qWarning() 获取SQLite连接超时30秒当前连接数已达上限 m_maxConn; return QSqlDatabase(); // 返回无效连接 } } } // 步骤2取出空闲连接并验证有效性 QString connName m_freeConnNames.pop(); QSqlDatabase db QSqlDatabase::database(connName, false); // false不自动打开 // 连接失效则重建 if (!isConnectionValid(db)) { qDebug() 连接失效重建连接 connName; db createNewConnection(); } return db; } // 归还连接到池 void SqliteConnectionPool::releaseConnection(const QSqlDatabase db) { if (!db.isValid()) return; QMutexLocker locker(m_mutex); QString connName db.connectionName(); // 确保连接未被重复归还 if (!m_freeConnNames.contains(connName)) { m_freeConnNames.push(connName); m_cond.wakeOne(); // 唤醒等待连接的线程 qDebug() 归还连接 connName 当前空闲连接数 m_freeConnNames.size(); } } // 释放所有连接 void SqliteConnectionPool::releaseAllConnections() { QMutexLocker locker(m_mutex); while (!m_freeConnNames.isEmpty()) { QString connName m_freeConnNames.pop(); QSqlDatabase::removeDatabase(connName); m_curConn--; } qDebug() 已释放所有SQLite连接总计 (m_maxConn - m_curConn); } // 检查连接有效性 bool SqliteConnectionPool::isConnectionValid(const QSqlDatabase db) { if (!db.isOpen()) return false; // 执行简单SQL验证连接SQLite 通用 QSqlQuery query(db); return query.exec(SELECT 1); } // 创建新连接 QSqlDatabase SqliteConnectionPool::createNewConnection() { // 生成唯一连接名称前缀 当前连接数 线程ID避免冲突 QString connName m_connPrefix QString::number(m_curConn) _ QString::number((qlonglong)QThread::currentThreadId()); // 创建SQLite连接 QSqlDatabase db QSqlDatabase::addDatabase(QSQLITE, connName); db.setDatabaseName(m_dbPath); // SQLite 优化参数可选根据业务调整 db.setConnectOptions( QSQLITE_OPEN_URI1; // 启用URI模式 QSQLITE_ENABLE_SHARED_CACHE1; // 共享缓存多连接时减少内存占用 QSQLITE_BUSY_TIMEOUT5000 // 忙时等待5秒避免锁冲突 ); // 打开连接 if (db.open()) { m_curConn; qDebug() 创建新连接成功 connName 当前总连接数 m_curConn; } else { qCritical() 创建SQLite连接失败 db.lastError().text(); QSqlDatabase::removeDatabase(connName); // 清理无效连接 } return db; }3. 使用示例多线程场景cpp运行#include QCoreApplication #include QThread #include QSqlQuery #include QDebug #include SqliteConnectionPool.h // 工作线程执行SQL操作 class SqlWorker : public QThread { protected: void run() override { // 1. 获取连接 QSqlDatabase db SqliteConnectionPool::getInstance().getConnection(); if (!db.isValid() || !db.open()) { qWarning() 线程 QThread::currentThreadId() 获取连接失败 db.lastError().text(); return; } // 2. 执行SQL示例创建表 插入数据 QSqlQuery query(db); // 创建表仅第一次执行有效 if (!query.exec(CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, name TEXT))) { qWarning() 创建表失败 query.lastError().text(); } // 插入数据 query.prepare(INSERT INTO test (name) VALUES (:name)); query.bindValue(:name, Thread_ QString::number((qlonglong)QThread::currentThreadId())); if (query.exec()) { qDebug() 线程 QThread::currentThreadId() 插入数据成功ID query.lastInsertId().toInt(); } else { qWarning() 插入数据失败 query.lastError().text(); } // 3. 归还连接 SqliteConnectionPool::getInstance().releaseConnection(db); } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 初始化连接池 SqliteConnectionPool pool SqliteConnectionPool::getInstance(); pool.setConfig(./test.db, 5); // 数据库路径 最大5个连接 // 创建10个工作线程测试连接池复用 QListSqlWorker* workers; for (int i 0; i 10; i) { SqlWorker* worker new SqlWorker; workers.append(worker); worker-start(); } // 等待所有线程结束 for (SqlWorker* worker : workers) { worker-wait(); delete worker; } return a.exec(); }核心特性说明线程安全使用QMutex保证连接池的读写互斥使用QWaitCondition实现「无空闲连接时的阻塞等待」避免频繁创建连接。连接有效性获取连接时执行SELECT 1验证连接是否可用失效则自动重建。SQLite 优化参数QSQLITE_BUSY_TIMEOUT5000遇到数据库锁时等待 5 秒避免直接报错QSQLITE_ENABLE_SHARED_CACHE多连接共享缓存减少内存占用。连接名称唯一性连接名称 前缀 连接数 线程 ID避免QSqlDatabase名称冲突。注意事项连接必须归还使用完连接后必须调用releaseConnection否则会导致连接池耗尽。避免长连接占用业务逻辑应尽快释放连接不要长时间持有。线程内复用连接同一个线程多次操作数据库时建议复用同一个连接无需每次都获取 / 归还。数据库文件权限确保程序对 SQLite 数据库文件所在目录有读写权限。最大连接数设置SQLite 单文件数据库的连接数不宜过大建议 5~20过多连接会增加锁竞争。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

大航母网站建设怎么样高中信息技术课程做网站

CPU使用上升 top 查看cpu使用率高的进程 top -Hp pid查看进程下线程spu使用情况 CPU Profiling进行cpu使用情况统计(或JProfiler) 内存使用上升 通过分析dump 查找异常对象、不可达类分析、泄漏报表、线程使用情况、堆外内存分析 接口耗时上升 arthas分析…

张小明 2026/1/10 12:51:51 网站建设

提升网站排名seo在线工具

Spring 远程调用:原理、实践与应用 在 Java 企业应用的开发中,远程调用是一个非常重要的话题。它允许不同的组件之间进行通信,从而实现分布式应用的开发。Spring 框架为远程调用提供了强大的支持,本文将深入探讨 Spring 中的远程调用架构,包括如何使用 Spring 的支持类来…

张小明 2026/1/10 8:44:42 网站建设

高端个人网站卓讯企业名录搜索软件

第一章:Java智能运维预测模型概述 在现代企业级应用中,Java 作为核心开发语言广泛应用于后端服务。随着系统复杂度的提升,传统运维方式已难以满足高可用性与故障预警的需求。智能运维(AIOps)结合机器学习与大数据分析技…

张小明 2026/1/10 10:53:26 网站建设

0基础建站教程宁波网络营销推广开发中心

大型用例与分层系统模式解析 在系统设计和开发中,用例建模是一种重要的技术,它能够帮助我们清晰地描述系统的功能和用户与系统之间的交互。然而,在实际应用中,我们常常会遇到大型用例和分层系统的设计问题。下面将详细介绍大型用例的两种模式以及分层系统的相关模式和应用…

张小明 2026/1/10 22:45:25 网站建设

专业做招聘的网站有哪些做类似电驴网站

目录已开发项目效果实现截图开发技术介绍核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!已开发项目效果…

张小明 2026/1/10 11:58:15 网站建设

响应式网站建设多少钱设计网站

如何快速掌握pyEIT:电阻抗断层成像新手的完整指南 【免费下载链接】pyEIT Python based toolkit for Electrical Impedance Tomography 项目地址: https://gitcode.com/gh_mirrors/py/pyEIT 电阻抗断层成像(EIT)技术作为现代医学成像和…

张小明 2026/1/12 7:15:40 网站建设