由于mysql客户端编程还未深入学习,所以mysql连接池的一些知识可能没办法深入下去。
线程池和连接池的区别
- 线程池是主动操作,主动获取任务并执行任务;
- 连接池是被动操作(类似内存池),池的对象被任务获取,执行完任务后归还;
- 一个连接只能被一个线程使用;
- 服务端和客户端是相对的;
- 连接池内部是长连接。
连接池设计要点
- 同时并发128个连接,大部分情况同时操作数据库64个线程
- 最小连接数64,最大连接数128
- 任务:获取连接,操作数据库,归还连接
- 注意:避免占用连接不归还
- 分库,例子如下:
用户消息 独立数据库和独立服务器 poolname = “login”
聊天消息 独立数据库和独立服务器 poolname = “msg” - mysql连接池要设置重新连接以及字符集修改为4字节utf8类型
mysql_options(m_mysql, MYSQL_OPT_RECONNECT, &reconnect); // 配合mysql_ping实现自动重连
mysql_options(m_mysql, MYSQL_SET_CHARSET_NAME, "utf8mb4"); // utf8mb4和utf8区别
utf8只支持3个字节的unicode,所以要换成utf8mb4可以支持4个字节
- 线程池和连接池的数量通常相同
- 虚拟机对于性能很大单线程对写入性能影响很大, 磁盘io写入等待时间长
IO密集型任务
- 一个cpu可以有多个核心
杂项
- 连接池–同步连接,要阻塞等待io返回
- 异步比同步在编程上复杂的多;
- 重点问题:
- 为什么要用连接池
- 连接池和线程池怎么配合同步的连接池
- 连接池-线程池数量,io同步的时间的问题
- mysql redis同步连接和一步连接的区别
- 连接池的扩展功能
补充提高
- 了解一下druid连接池
- 如何从连接池中分析中最大连接时间,归还的时间- 请求的时间 =1001ms,超过1000ms打印警告信息。
- 每秒请求连接的次数req_count
- 程序异常,可能连接没有归还,
- m_used_list.push_back
- 每隔5s检测连接,如超时5s没有归还,则手动销毁,重新创建新连接加入m_free_list