ZBLOG

c/c++ 写个mysql连接池

以下是一个简单的C++ MySQL连接池示例:

  1. #include <mysql/mysql.h>
  2. #include <iostream>
  3. #include <queue>
  4. #include <mutex>
  5. #define DB_HOST "localhost"
  6. #define DB_USER "username"
  7. #define DB_PASS "password"
  8. #define DB_NAME "mydatabase"
  9. class ConnectionPool {
  10. private:
  11. std::queue<MYSQL*> connection_queue;
  12. std::mutex mtx;
  13. public:
  14. ConnectionPool(int size) {
  15. for (int i = 0; i < size; i++) {
  16. MYSQL* conn = mysql_init(NULL);
  17. if (conn != NULL && mysql_real_connect(conn, DB_HOST, DB_USER, DB_PASS, DB_NAME, 0, NULL, 0)) {
  18. connection_queue.push(conn);
  19. } else {
  20. // 处理连接错误
  21. std::cerr << "Failed to connect to database: " << mysql_error(conn) << std::endl;
  22. if (conn != NULL) {
  23. mysql_close(conn);
  24. }
  25. }
  26. }
  27. }
  28. ~ConnectionPool() {
  29. while (!connection_queue.empty()) {
  30. MYSQL* conn = connection_queue.front();
  31. connection_queue.pop();
  32. mysql_close(conn);
  33. }
  34. }
  35. MYSQL* getConnection() {
  36. std::lock_guard<std::mutex> lock(mtx);
  37. if (!connection_queue.empty()) {
  38. MYSQL* conn = connection_queue.front();
  39. connection_queue.pop();
  40. return conn;
  41. }
  42. return nullptr;
  43. }
  44. void releaseConnection(MYSQL* conn) {
  45. std::lock_guard<std::mutex> lock(mtx);
  46. if (conn != nullptr) {
  47. connection_queue.push(conn);
  48. }
  49. }
  50. };
  51. int main() {
  52. // 创建一个包含5个连接的连接池
  53. ConnectionPool pool(5);
  54. // 获取连接
  55. MYSQL* conn1 = pool.getConnection();
  56. if (conn1 != nullptr) {
  57. // 使用连接进行数据库操作
  58. // ...
  59. // 释放连接
  60. pool.releaseConnection(conn1);
  61. }
  62. // 获取另一个连接
  63. MYSQL* conn2 = pool.getConnection();
  64. if (conn2 != nullptr) {
  65. // 使用连接进行数据库操作
  66. // ...
  67. // 释放连接
  68. pool.releaseConnection(conn2);
  69. }
  70. return 0;
  71. }

这个示例使用了C++的标准库容器queue和互斥锁mutex来实现MySQL连接池。在构造函数中,它创建了指定数量的MySQL连接,并将其添加到队列中。getConnection()方法用于获取可用的连接,如果队列不为空,则从队列中取出一个连接并返回;否则返回空指针。releaseConnection()方法用于将使用完毕的连接放回队列。

需要注意的是,你需要在编译时链接MySQL C++库(例如加入 -lmysqlclient 参数)。同时,请根据实际情况修改代码中的数据库主机名、用户名、密码和数据库名称,并进行适当的错误处理。

此示例仅提供了基本的功能,实际应用中可能需要添加更多功能以满足具体需求,比如设置最大连接数限制、超时处理等。

希望这个示例能够帮助你开始构建自己的C/C++ MySQL连接池。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=18231

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?