为什么需要连接池
一起来看看原始数据库连接的做法
首先,每一次web请求都要建立一次数据库连接。
建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。
这个时间对于一次或几次数据库操作,或许感觉不出系统有多大的开销。
对于现在的web应用,尤其是大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。
该情况下,频繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的甚至会造成服务器的崩溃。
解决方案
问题的根源就在于对数据库连接资源的低效管理。
我们知道,对于共享资源,有一个很著名的设计模式:资源池(resource pool)。
该模式正是为了解决资源的频繁分配﹑释放所造成的问题。
为解决上述问题,可以采用数据库连接池技术。
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。
预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。
更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。
引入数据库连接池依赖
需要注意mybatis版本与druid的版本要对应上,不然会被坑死!
<dependencies>
<!-- 阿里巴巴 EasyExcel依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- 数据库,由于mybatis集成druid存在一些问题,版本上需要严格控制,否则会报SQLFeatureNotSupportedException -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<!-- mybatis-plus3 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.7.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.0.7.1</version>
</dependency>
</dependencies>
编写配置文件
application.properties
# 初始化时建立物理连接的个数
spring.datasource.druid.initial-size=5
# 最小连接池数量
spring.datasource.druid.min-idle=5
# 最大连接池数量
spring.datasource.druid.max-active=20
# 获取连接时最大等待时间
spring.datasource.druid.max-wait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
# 合并多个DruidDataSource的监控数据
spring.datasource.druid.use-global-data-source-stat=true
# 用来检测连接是否有效的sql,要求是一个查询语句
spring.datasource.druid.validation-query=SELECT 'x'
# 配置监控页面访问登录名称
spring.datasource.druid.stat-view-servlet.login-username=admin
# 配置监控页面访问密码
spring.datasource.druid.stat-view-servlet.login-password=admin
# 配置监控页面的访问路径(/druid, /druid/login.html ...)
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 是否开启慢sql查询监控
spring.datasource.druid.filter.stat.log-slow-sql=true
# 慢SQL执行时间
spring.datasource.druid.filter.stat.slow-sql-millis=2000
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.druid.connect-properties.=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.druid.filters=stat,wall,slf4j
# 配置aop路径(top.mocha.easyexcel.service)
spring.datasource.druid.aop-patterns=top.mocha.*.service.*
application.yml
server:
port: 9090
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: 123465
type: com.alibaba.druid.pool.DruidDataSource
mybatis-plus:
# 指定sql映射文件位置
mapper-locations: classpath:mapper/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
访问Druid监控页面
http://ip地址:项目端口号/druid
跳坑!MyBatis版本与Druid版本不一致问题!
问题描述:(create_time对应的Java字段为LocalDateTime类型)
导出Excel异常!异常原因:[Error attempting to get column 'create_time' from result set. Cause: java.sql.SQLFeatureNotSupportedException
; null; nested exception is java.sql.SQLFeatureNotSupportedException]
一开始只是使用MyBatis-Plus进行项目集成,但是测试后不行
真的要被这个地方坑死了!找了很久是什么问题,结果原来是因为Mybatis与Druid的版本不一致!
于是手动设置MyBatis以及Druid的版本