数据源与数据库连接池

什么是数据源?

JDBC2.0提供了javax.sql.DataSource接口,它负责建立与数据库的连接,当在应用程序中访问数据库时,不必编写连接数据库的代码,直接引用DataSource获取数据库的连接对象即可。用于获取操作数据的Connection对象。

 

什么是数据库连接池?

数据库连接池的思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。可通过设定连接池的最大连接数来防止系统无尽的与数据库连接。更重要的是我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发、测试以及性能调整提供依据。

 

数据源和数据库连接池的关系?

数据源建立多个数据库连接,这些数据库连接将会保存在数据库连接池中,当需要访问数据库时,只需要从数据库连接池中获取空闲的数据库连接,当程序访问数据库结束时,数据库连接会放回数据库连接池中。

 

为什么要使用数据库连接池?

传统的JDBC访问数据库技术,每次访问数据库都需要通过数据库驱动器Driver和数据库名称以及密码等等资源建立数据库连接。

如此就会存在两大问题:

  1. 频繁的建立与断开数据库连接,会降低执行效率,增加系统资源的开销。
  2. 数据库的连接需要用户名和密码等资源,这些也需要一定的内存和CPU的开销。 

而数据库连接池很好地解决了这些问题。

 

JAVA常用的数据库连接池?

Druid、DBCP、C3P0、BoneCP、Proxool、DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager等

 

 Druid连接池

概念

Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都远超其他数据库连接池,

组成

Druid是一个JDBC组件,它包括三个部分:

  1. 基于Filter-Chain模式的插件体系。
  2. DruidDataSource高效可管理的数据库连接池。
  3. SQLParser

功能

  1. 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
  2. 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
  3. 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
  4. SQL执行日志。Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
  5. 扩展JDBC。如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。

使用原因

原先项目使用的是C3P0连接池,在项目发布使用一段时间后发现c3p0 连接池访问数据库的时候创建连接会在oralce的lisenter.log 日志文件记录。 

经过一段时间观察发现oralce每6秒会在lisenter.log日志记录一次,我们设置的最小连接是20,所以oracle每次会在日志记录20条。随着时间越长日志文件越来越大,当日志文件达到4个G的时候会导致oracle死掉。 经过不断调整参数配置还是无法得到解决方案,最后选择使用阿里Druid连接池试试,Druid默认最小连接2个,配置好后发布观察日志发现只在创建的时候在日志里面记录了2条记录。没有像C3P0那样每6秒记录一次导致日志文件越来越大。 

 

springboot集成druid连接池配置 (spring中使用druid的配置

pom.xml中需要引入的依赖

1         <dependency>
2             <groupId>com.alibaba</groupId>
3             <artifactId>druid-spring-boot-starter</artifactId>
4             <version>1.1.10</version>
5         </dependency>

application.yml需要添加的配置

 1 spring:
 2   datasource:
 3     type: com.alibaba.druid.pool.DruidDataSource
 4     driverClassName: com.mysql.cj.jdbc.Driver
 5     driver-class-name: com.mysql.cj.jdbc.Driver
 6     platform: mysql
 7     url: jdbc:mysql://127.0.0.1:3306/xxx?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
 8     username: root
 9     password: 123456
10     initialSize: 5
11     minIdle: 5
12     maxActive: 20
13     maxWait: 60000
14     timeBetweenEvictionRunsMillis: 60000
15     minEvictableIdleTimeMillis: 300000
16     validationQuery: SELECT1FROMDUAL
17     testWhileIdle: true
18     testOnBorrow: false
19     testOnReturn: false
20     filters: stat,wall,log4j
21     logSlowSql: true 

到此springboot就集成的druid的配置可以直接使用

springboot添加druid监控平台配置类

 1 import com.alibaba.druid.support.http.StatViewServlet;
 2 import com.alibaba.druid.support.http.WebStatFilter;
 3 import org.slf4j.Logger;
 4 import org.slf4j.LoggerFactory;
 5 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 6 import org.springframework.boot.web.servlet.ServletRegistrationBean;
 7 import org.springframework.context.annotation.Bean;
 8 import org.springframework.context.annotation.Configuration;
 9 
10 /**
11  * 数据库链接池druid监控平台的配置
12  * 访问路径 http://localhost:8080/druid/index.html
13  *
14  */
15 @Configuration
16 public class DruidConfiguration {
17 
18     private static final Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);
19 
20     @Bean
21     public ServletRegistrationBean druidServlet() {
22         logger.info("init Druid Servlet Configuration ");
23         ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
24         // IP白名单
25 //        servletRegistrationBean.addInitParameter("allow", "*");
26         // IP黑名单(共同存在时,deny优先于allow)
27 //        servletRegistrationBean.addInitParameter("deny", "192.168.1.100");
28         //控制台管理用户
29         servletRegistrationBean.addInitParameter("loginUsername", "admin");
30         servletRegistrationBean.addInitParameter("loginPassword", "admin");
31         //是否能够重置数据 禁用HTML页面上的“Reset All”功能
32         servletRegistrationBean.addInitParameter("resetEnable", "false");
33         return servletRegistrationBean;
34     }
35     @Bean
36     public FilterRegistrationBean filterRegistrationBean() {
37         FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
38         filterRegistrationBean.addUrlPatterns("/*");
39         filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
40         return filterRegistrationBean;
41     }
42 }

测试界面

 

相关可学习的博客(进一步学习更深的知识):

1.数据库连接池学习笔记(一):原理介绍+常用连接池介绍

2.数据库连接池-常用参数配置及含义

3.三种数据库连接池的配置

posted on 2020-07-20 13:52  CHENSISI  阅读(1330)  评论(0编辑  收藏  举报