池化技术
池化技术
数据库连接池
数据库的调用方式是先获取数据库的连接,然后依靠这条连接从数据库中查询数据,最后关闭连接释放数据库资源。这种调用方式下,每次执行 SQL 都需要重新建立连接,频繁地建立数据库连接是很耗费时间的。
这个时候就需要用到池化技术:建立数据库连接池。
数据库连接池有两个最重要的配置:最小连接数和最大连接数
- 最小连接数:是连接池一直保持的数据库连接
- 最大连接数:是连接池能申请的最大连接数
从连接池中获取连接的相关策略:
- 如果当前连接数小于最小连接数,则创建新的连接处理数据库请求,保证池中的最小连接数;
- 如果当前连接数大于最小连接数小于最大连接数
- 如果连接池中有空闲连接则复用空闲连接;
- 没有则创建新的连接处理请求;
- 如果当前连接数已经大于等于最大连接数,则按照配置中设定的时间(C3P0 的连接池配置是 checkoutTimeout)等待旧的连接可用
- 如果等待超过了这个设定时间则向用户抛出错误。
会遇到的问题:
连接断开问题:
- 数据库的域名对应的 IP 发生了变更,池子的连接还是使用旧的 IP。
- MySQL 有个参数是“wait_timeout”,控制着当数据库连接闲置多长时间后,数据库会主动地关闭这条连接。
解决方案:
进行定期检测连接问题:
启动一个线程来定期检测连接池中的连接是否可用,比如使用连接发送“select 1”的命令给数据库看是否会抛出异常,如果抛出异常则将这个连接从连接池中移除,并且尝试关闭。(目前 C3P0 连接池可以采用这种方式来检测连接是否可用,也是比较推荐的)
在使用连接上进行校验,可用再执行SQL(比如 DBCP 连接池的 testOnBorrow 配置项)。
一般在线上建议最小连接数控制在 10 左右,最大连接数控制在 20~30 左右即可。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 goMars的学习随记!
评论