女生做交互设计师好吗苏州搜狗关键词优化

张小明 2026/1/11 6:26:37
女生做交互设计师好吗,苏州搜狗关键词优化,网站怎么做是满屏,ih5平台发展前景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进行投诉反馈,一经查实,立即删除!

宁波h5网站建设广州新业建设管理有限公司网站

第一章:AI Agent文档生成的核心挑战 在构建AI Agent自动生成技术文档的系统时,开发者面临多重核心挑战。这些挑战不仅涉及自然语言理解与生成的质量问题,还包括上下文一致性、结构化输出控制以及多源信息融合等复杂任务。 语义准确性与上下文…

张小明 2026/1/10 16:37:47 网站建设

怎么免费建立自己网站seo网站推广优化费用

实用的Web脚本技巧与管理方法 1. 动态构建网页内容 在Web开发中,有时需要动态构建网页内容。以Kevin & Kell漫画为例,其漫画的URL由当前年份、月份和日期构成,例如: http://www.kevinandkell.com/2016/strips/kk20160804.jpg 。要动态构建包含该漫画的页面,脚本需…

张小明 2026/1/5 22:49:14 网站建设

优质手机网站建设服装网站建设报关

洛阳庆典哪家强?专业庆典活动公司大揭秘!引言洛阳,这座历史文化名城,自古以来便是各种庆典活动的聚集地。无论是传统节日、婚礼庆典,还是企业开业、周年庆等活动,都离不开专业的庆典活动公司。那么&#xf…

张小明 2026/1/5 6:57:38 网站建设

图片网站用什么主机网站建设亿玛酷适合5

文章目录理论知识1、什么是Rsync2、备份方式Rsync应用场景在大量服务器进行备份的场景Rsync数据传输方式Rsync同步实验操作实验环境实验需要实验步骤服务端操作1、安装软件包2、编辑配置文件3、创建虚拟用户密码文件(用于客户端连接时使用的用户)4、创建目录5、创建程序用户并授…

张小明 2026/1/9 1:14:50 网站建设

大连个人网站建设皖icp网站建设

大数据预测分析在供应链管理中的应用:从理论到实践的效率提升框架 元数据框架 标题 大数据预测分析在供应链管理中的应用:从理论到实践的效率提升框架 关键词 大数据预测、供应链管理、需求预测、库存优化、机器学习、因果推断、智能决策 摘要 在全球化与…

张小明 2025/12/31 23:00:54 网站建设

linux下网站开发网站动图怎么做的

Qwen3-14B-AWQ智能体工具调用实战 在企业级AI应用开发中,一个长期存在的矛盾是:大模型能力强但部署成本高,小模型轻量却难以胜任复杂任务。直到像 Qwen3-14B-AWQ 这类中型强推理模型的出现,才真正让中小企业也能拥有“能说会做”的…

张小明 2025/12/31 15:17:03 网站建设