# connection_pool **Repository Path**: diabio/connection_pool ## Basic Information - **Project Name**: connection_pool - **Description**: 这是用一个c语言实现的MYSQL数据库连接池 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-05-06 - **Last Updated**: 2025-09-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: C语言, cmake ## README # MySQL 连接池(C语言实现) ## 项目简介 这是一个用C语言实现的 线程安全MySQL连接池 ,基于pthread库实现同步控制,支持动态连接创建、超时获取连接、空闲连接自动清理等功能。主要用于解决频繁创建/销毁MySQL连接带来的性能损耗问题,适用于高并发数据库访问场景~ ## 功能特性 - ✅ 线程安全 :使用 pthread_mutex 互斥锁和 pthread_cond 条件变量实现多线程同步 - ⏳ 超时机制 :获取连接支持超时(默认1000ms),防止线程无限阻塞 - 🧹 空闲清理 :自动清理5分钟未使用的空闲连接( IDLE_CONN_CLEANUP_SEC 可配置) - 📊 动态扩缩 :连接数不足时自动创建新连接(不超过最大池大小) - 🚨 详细错误追踪 :每个连接和连接池都有独立的错误码+错误信息记录 ## 依赖要求 - MySQL C客户端库( libmysqlclient ) - POSIX线程库( pthread ) - C11及以上编译器 ## 快速开始 ### 构建项目 ```bash apt install libmysqlclient-dev # 构建 mkdir build && cd build cmake .. make ``` ### 使用示例 ```c #include "connection_pool.h" int main() { // 1. 配置数据库信息 DataBase_t db = { .host = "127.0.0.1", .port = 3306, .user = "diabio", .password = "diabio", .dbName = "cloud_storage" }; // 2. 创建连接池(初始2连接,最大5连接) ConnectionPool_t *pool = createConnectionPool(db, 2, 5); if (!pool) { fprintf(stderr, "连接池创建失败: %s\n", pool->lastError.errorMsg); return -1; } // 3. 获取连接 Connection_t *conn = getConnection(pool); if (conn) { printf("获取连接成功!MySQL连接指针: %p\n", conn->conn); // 这里执行你的数据库操作... // 4. 释放连接回池 releaseConnection(pool, conn); } // 5. 销毁连接池 destroyConnectionPool(pool); return 0; } ``` ## API 文档 ### ConnectionPool_t* createConnectionPool(DataBase_t db, int connStartNum, int connPoolSize) - 功能 :创建连接池 - 参数 : - db :数据库连接配置(host/port/user/password/dbName) - connStartNum :初始创建的连接数 - connPoolSize :连接池最大容量 - 返回 :连接池指针(失败返回NULL) ### Connection_t* getConnection(ConnectionPool_t *connPool) - 功能 :从连接池获取可用连接(带超时机制) - 返回 :连接对象指针(超时或失败返回NULL) ### int releaseConnection(ConnectionPool_t* connPool, Connection_t* conn) - 功能 :释放连接回连接池 - 返回 : CP_SUCCESS (成功)或错误码 ### int destroyConnectionPool(ConnectionPool_t *connPool) - 功能 :销毁连接池并释放所有资源 - 返回 : CP_SUCCESS (完全销毁)或 CP_ERR_DESTROY_INCOMPLETE ### void pool_cleanup(ConnectionPool_t* connPool); - 功能 : 清理多余的空闲线程 - 返回 : 无 ## 错误码说明 | 错误码 | 含义 | | -- | -- | |CP_SUCCESS | 操作成功 | |CP_ERR_MALLOC | 内存分配失败 | |CP_ERR_INIT_POOL_FAILED | 连接池初始化失败 | |CP_ERR_GET_TIME_FAILED | 获取系统时间失败 | |CP_ERR_MYSQL_INIT_FAILED | mysql_init() 失败 | |CP_ERR_MYSQL_CONNECT_FAILED | MySQL连接失败 | |CP_ERR_POOL_FULL | 池子满了(在我们创建连接的期间被其他线程填满)| |CP_ERR_INTERNAL | 这表示连接池内部状态不一致 | |CP_ERR_CONN_INVALID_STRUCT | 这表示非法的Connection_t结构 | ## 测试说明 项目自带多线程压力测试和超时测试(在 test/test.c 中),验证了: - 多线程并发获取/释放连接的稳定性 - 连接池满时的超时机制 - 动态创建新连接的能力 - 空指针/非法操作的容错性 运行测试: ```bash # 注: 请把test.c中的数据库配置改成自己的数据库配置 # 构建后直接运行 ./main ```