数据库连接池
连接池的思想就是建立一个"缓存池",预先存放一定数量的连接,当需要建立数据库连接时,就从"缓存池"中取出一个,用完之后再放入池中。
连接池是怎么管理、分配连接对象呢?
使用一个"空闲池"管理已经被创建但未被使用的连接,当有一个新的连接请求时,首先再"空闲池"中寻找空闲的连接对象,如果池中有空闲连接对象,就把空闲时间最长的那个连接对象取出来分配(前提是这个对象是有效的),如果这个对象不可用,就将其从"空闲池"中删除,重新检测。如果没有检测到可用连接,则判断当前连接数是否达到最大连接数,如果没有,则创建新的连接,如果达到最大连接数,则进入等待。如果在等待的时间内,检测到可用的连接,则进行分配,如果超时还未检测到可用连接,则返回null。系统只对所创建的连接进行计数统计,对于检测可用连接,可开辟线程(提示响应速度,增加系统开销)、也可在分配前进行检测。
Druid
Durid是阿里开源的JDBC应用组件,包括三部分:
- DruidDriver:代理Driver,能提供基于Filter-Chian模式的插件系统
- DruidDataoSource:高效可管理的数据库连接池
- SQLParser:SQL语法分析
通过Druid连接池中间件,可以实现:
- 可监控的数据库访问的性能,Druid提供了一个强大的StatFilter插件,能详细的统计SQL执行性能,对于线上分析数据库访问性能非常有利
- 替换传统的==DBCP==和==C3P0==中间件。提供一个高效、功能强大、可监控的数据库连接池
- 数据库密码加密。直接把数据库密码写入配置文件中,会存在极大的安全问题,DruidDriver和DruidDataSource都支持PasswordCallBack。
- SQL执行日志。Druid提供了不同的LogFilter,能够支持==Common-Logging==、==Log4j==和==jdkLog==,可按需选择日志框架
- 扩展JDBC。如果对JDBC层有编程需求、可通过Druid提供的Filter-Chain机制,方便编写JDBC扩展插件
案例
pom.xml中添加依赖
<!--Druid依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
修改数据源配置
datasource:
name: druidDataSource
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.1.8:3306/studenms?useUnicode=true&zeroDateTimeBehavior=CONVERT_TO_NULL&autoReconnect=true&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: sa
filters: stat,wall,log4j,config
max-active: 100
initial-size: 1
max-wait: 60000
min-idle: 1
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 30000
validation-query: select 'X'
test-while-idle: true
test-on-borrow: false
test-on-return: false
max-pool-prepared-statement-per-connection-size: 20
max-open-prepared-statements: 50
# 配置监控服务器
stat-view-servlet:
# 这里一定要配置true,不配置则是使用默认值false,空白页面
enabled: true
login-username: root
login-password: sa
reset-enable: false
url-pattern: /druid/*
参数说明:
- max-active:最大连接数
- initial-size: 初始化连接数
- min-idle:最小连接数
- max-wait:等待最长时间
- time-between-eviction-runs-millis:间隔多久检测一次
- min-evictable-idle-time-millis:一个连接池最小的生存时间
- filters: stat,wall,log4j,config,配置监控统计拦截的filers,如果没有,则监控界面无法统计,‘wall’用于防火墙
Druid提供以下几种Filter
Druid-spring-boot-starter简化了一些配置,如果需要自定义配置,参考Druid-spring-boot-starte自定义配置
测试
浏览器输入localhost:8090/druid,会自动跳转到登录界面
输入监控服务配置中的login-username和login-password,进入控制台页面
测试接口
执行分页查询的接口
进入控制台,查看SQL监控。
从SQL监控发现,执行了2条SQL。调用一个接口,执行了2条SQL,这是为什么?
答:刚才说到这是分页查询接口,使用mybatis分页查询时,要写2条SQL,一条查询Count(*),一条是分页查询。由于接口使用了pagehelper插件,它简化了mybatis的sql,开发者只用写一条查询所有数据的SQL,它会自动拦截,进行分页,因此实际上是执行了2条SQL。
同时从图中还发现发现,执行select count(*)语句耗时14毫秒,druid给出了"最慢"提示。实际上这张表只有3行,7个字段。由此可见select count()要慎用。
还可以看到url的监控,具体执行了哪些api接口,这里都可以查看
问题
1.出现如下错误信息,是缺少log4j依赖,在pom.xml引入依赖,即可
- druid监控页面空白
检查==stat-view-servlet==监控服务配置是否开启,将enable设置为true
来源:oschina
链接:https://my.oschina.net/CodeCow/blog/4311350