由于mysql客户端编程还未深入学习,所以mysql连接池的一些知识可能没办法深入下去。

线程池和连接池的区别

  • 线程池是主动操作,主动获取任务并执行任务;
  • 连接池是被动操作(类似内存池),池的对象被任务获取,执行完任务后归还;
  • 一个连接只能被一个线程使用;
  • 服务端和客户端是相对的;

go mysql 连接池 mysql连接池是长连接吗_数据库

  • 连接池内部是长连接

连接池设计要点

go mysql 连接池 mysql连接池是长连接吗_连接池_02

  • 同时并发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密集型任务

go mysql 连接池 mysql连接池是长连接吗_mysql_03

  • 一个cpu可以有多个核心

杂项

  • 连接池–同步连接,要阻塞等待io返回
  • 异步比同步在编程上复杂的多;
  • 重点问题:
  • 为什么要用连接池
  • 连接池和线程池怎么配合同步的连接池
  • 连接池-线程池数量,io同步的时间的问题
  • mysql redis同步连接和一步连接的区别
  • 连接池的扩展功能

补充提高

  • 了解一下druid连接池
  • 如何从连接池中分析中最大连接时间,归还的时间- 请求的时间 =1001ms,超过1000ms打印警告信息。
  • 每秒请求连接的次数req_count
  • 程序异常,可能连接没有归还,
  • m_used_list.push_back
  • 每隔5s检测连接,如超时5s没有归还,则手动销毁,重新创建新连接加入m_free_list