赞
踩
连接池也是池化技术的一种应用,池化技术能够减少资源对象的创建次数,提高程序的响应性能,特别是在高并发下这种提高更加明显。
使用池化技术缓存的资源对象有如下共同特点:
数据库连接池(Connection pool)是程序启动时建立足够的数据库连接,并将这些连接组成
一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
如果你的模块压根就一两个连接,且有独立的句柄维护,并且持久复用,就不需要连接池;
如果你的模块有很多用户会访问,每次访问都需要进行三次握手,数据库的认证,传输,mysql语句的query以及连接断开,那连接池就很有必要了(避免无意义的带宽和时间浪费以及过高的网络IO)。
结合上图,可以了解连接池有以下优点:
(结果取自Darren@0voice)
经验公式:连接数 = ((核心数 * 2) + 有效磁盘数)
CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数
总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数
Linux c接口中的mysql的性能优化是题主最近需要解决的问题;
c语言对于mysql的业务逻辑支持并不好,一方面mysql的sql语句组合起来较为麻烦,
另一方面mysql_query是同步的mysql接口,一次任务中如果需要更新多表多列则需要拼接大量的mysql语句并且query,此间会浪费大量的cpu(组sql)以及等待mysql结果的返回。
见上图可知,mysql语句的执行时最大的性能瓶颈。
简单调研后提供了如下优化思路:
来源:mysql中文手册
对于多次执行的语句,预处理执行比直接执行快,主要原因在于,仅对查询执行一次解析操作。
下述语句可用作预处理语句:CREATE TABLE、DELETE、DO、INSERT、REPLACE、SELECT、SET、UPDATE、以及大多数SHOW语句。在MySQL 5.1中,不支持其他语句
#include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> #define DB_HOST "localhost" #define DB_USER "your_username" #define DB_PASS "your_password" #define DB_NAME "your_database" int main() { MYSQL *conn; MYSQL_STMT *stmt; MYSQL_BIND param[2]; char query[256] = "INSERT INTO users (name, age) VALUES (?, ?)"; char name[50]; int age; // 初始化连接 conn = mysql_init(NULL); if (conn == NULL) { fprintf(stderr, "Failed to initialize MySQL connection\n"); return 1; } // 连接到 MySQL 服务器 if (mysql_real_connect(conn, DB_HOST, DB_USER, DB_PASS, DB_NAME, 0, NULL, 0) == NULL) { fprintf(stderr, "Failed to connect to MySQL database: Error: %s\n", mysql_error(conn)); mysql_close(conn); return 1; } // 准备预处理语句 stmt = mysql_stmt_init(conn); if (stmt == NULL) { fprintf(stderr, "Failed to initialize MySQL statement: Error: %s\n", mysql_error(conn)); mysql_close(conn); return 1; } // 编译和绑定参数 if (mysql_stmt_prepare(stmt, query, strlen(query)) != 0) { fprintf(stderr, "Failed to prepare MySQL statement: Error: %s\n", mysql_error(conn)); mysql_stmt_close(stmt); mysql_close(conn); return 1; } // 绑定参数 memset(param, 0, sizeof(param)); param[0].buffer_type = MYSQL_TYPE_STRING; param[0].buffer = name; param[0].is_null = 0; param[0].length = &name_length; param[1].buffer_type = MYSQL_TYPE_LONG; param[1].buffer = &age; param[1].is_null = 0; param[1].length = NULL; if (mysql_stmt_bind_param(stmt, param) != 0) { fprintf(stderr, "Failed to bind parameters: Error: %s\n", mysql_error(conn)); mysql_stmt_close(stmt); mysql_close(conn); return 1; } // 设置参数值 printf("Enter name: "); scanf("%s", name); printf("Enter age: "); scanf("%d", &age); // 执行预处理语句 if (mysql_stmt_execute(stmt) != 0) { fprintf(stderr, "Failed to execute MySQL statement: Error: %s\n", mysql_error(conn)); mysql_stmt_close(stmt); mysql_close(conn); return 1; } printf("Record inserted successfully!\n"); // 释放资源 mysql_stmt_close(stmt); mysql_close(conn); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。