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

张小明 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进行投诉反馈,一经查实,立即删除!

自己怎样建设网站深圳3d网站建设

第一章:Open-AutoGLM配置详解:99%开发者忽略的3个关键参数设置在部署 Open-AutoGLM 模型时,大多数开发者仅关注基础参数配置,却忽略了三个直接影响推理效率与资源消耗的核心设置。正确调整这些参数可将响应延迟降低40%以上&#x…

张小明 2026/1/8 10:08:01 网站建设

html网站列表怎么做福建建设工程环保备案网站入口

Mathtype公式转自然语言?试试这个基于ms-swift的数学理解模型 在教育科技与科研辅助工具日益智能化的今天,一个长期被忽视的问题逐渐浮出水面:AI 能流畅写文章、编代码,却常常“看不懂”一行简单的数学公式。这听起来有些讽刺——…

张小明 2026/1/8 5:55:06 网站建设

狮山网站建设公司高端网站建设公司报价

5步轻松部署Bodymovin插件:从AE动画到网页动效的完整指南 【免费下载链接】bodymovin-extension Bodymovin UI extension panel 项目地址: https://gitcode.com/gh_mirrors/bod/bodymovin-extension Bodymovin插件作为连接After Effects与网页动画的关键桥梁…

张小明 2026/1/8 18:18:40 网站建设

荆门网站制作DNF做钓鱼网站

将LangGraph工作流转化为LangFlow可视化流程 在构建AI智能体和自动化流程的实践中,我们正经历一场从“代码即一切”到“可视化即协作”的深刻转变。曾经,一个复杂的文本分析流水线需要数十行Python代码、层层嵌套的状态管理以及反复调试的日志输出&#…

张小明 2026/1/8 18:18:38 网站建设

北京建网站的公司高性能网站建设指南 书

从Multisim 14到20:老电路图迁移实战避坑指南你有没有遇到过这样的情况?手头有一堆用Multisim 14做好的经典仿真电路——可能是教学实验里的共射放大器,也可能是项目预研阶段验证过的电源拓扑。现在公司或实验室升级了软硬件环境,…

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

购物网站 英文介绍广西建设监理协会网站

MZmine 3质谱数据分析平台:从入门到精通的完整指南 【免费下载链接】mzmine3 MZmine 3 source code repository 项目地址: https://gitcode.com/gh_mirrors/mz/mzmine3 在当今代谢组学和蛋白质组学研究中,质谱数据分析已成为不可或缺的关键环节。…

张小明 2026/1/9 3:31:12 网站建设