1、为什么要使用数据库连接池?
创建数据库连接(TCP连接建立时需要三次握手)是一个很耗时的过程,在使用完之后,还需要不断的释放建立的连接(销毁时需要四次握手),对资源的损耗比较大。
数据库连接池会将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接访问数据库,这样可以省略创建连接和销毁连接的过程,从而提高性能。这样做的缺点是,可能某些时候完全没有数据库请求,但是也保持了数据库的最小连接数,浪费了资源,不过这种资源浪费相对于完全不采用数据库连接池还是很有优势的。
2、常用的数据库连接池
目前市场上常用的数据库连接池有:C3P0、Proxool、DBCP、Tomcat JDBC Pool、HiKariCP 和 Druid
性能方面:HiKariCP > Druid > Tomcat JDBC Pool > DBCP > C3P0 > Proxool
活跃度方面:C3P0、Proxool、DBCP的版本都已经很久没更新了,Tomcat JDBC Pool、HiKariCP 和 Druid仍处于活跃的更新中。Spring Boot 2.0 将默认的数据库连接池从Tomcat JDBC Pool 改为了HiKariCP。
虽然HikariCP已经很优秀,但是对于国内用户来说,可能对于Druid更为熟悉,Druid是阿里开源的数据库连接池,除了良好的性能和稳定性外,它还加入了监控统计、防御SQL注入等功能。
1、引入依赖
在pom.xml中引入Druid的依赖
com.alibaba
druid-spring-boot-starter
1.1.20
注:
1)如果打包时报如下警告,说明Druid引入的版本太高了,降低版本即可
The POM for com.alibaba:druid:jar:1.1.21 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details
2、配置application-dev.yml配置文件
spring:
datasource:
url: jdbc:mysql://localhost:3306/blog
username: root
password: test
type: com.alibaba.druid.pool.DruidDataSource
druid:
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 2000
validationQuery: select 'x'
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
注:
1)配置含义的详细说明见文章的第三模块“Druid的配置详解”
3、实体类和dao层配置
在blog数据库中,创建一个article表,然后创建它的实体类和dao层:
article表的实体类:
public class ArticlePo {
private Integer id;
private String articleId;
private String title;
// get、set...
}
dao层:
@Repository
public interface ArticleDao {
@Select("select * from article where article_id = #{articleId}")
@Results({@Result(column = "article_id", property = "articleId")})
ArticlePo get(@Param("articleId") String articleId);
// 给article赋值自增主键id
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into article(article_id, title) values(#{article.articleId}, #{article.title})")
int insert(@Param("article") ArticlePo articlePo);
}
4、修改启动类
在启动类DemoApplication上增加@MapperScan注解
@SpringBootApplication
@MapperScan(basePackages = "com.tn666.demo.dao")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
注:
1)@MapperScan注解的属性basePackages配置的为dao层的包路径
5、测试验证
编写ArticleController:
@RestController
@RequestMapping("/article")
public class ArticleController {
@Resource
private ArticleDao articleDao;
@GetMapping(value = "/get")
public ArticlePo get(@RequestParam("articleId") String articleId) {
ArticlePo articlePo = articleDao.get(articleId);
return articlePo;
}
@PostMapping(value = "/insert")
public Boolean insert(@RequestBody ArticlePo articlePo) {
articleDao.insert(articlePo);
Boolean res = false;
if (articlePo.getId() > 0) {
res = true;
}
return res;
}
}
注:
1)业务逻辑复杂时,Controller和Mapper中间会有Service层来处理业务逻辑,现在我们就简单的测试一下Druid数据库连接池,所以直接使用Controller调用Mapper了
更多内容,请关注公众号“图南随笔”: