欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库连接池————Druid的快速使用

程序员文章站 2022-05-17 18:40:35
...

1、什么是数据库连接池?
  传统的数据库使用是打开一个连接,进行一次库内操作,然后关闭连接释放资源。而连接池可以看成是一个保存连接的容器,为数据库连接建立了一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出,使用完毕之后再放回去。

2、为什么使用数据库连接池?
  由于传统数据库连接的频繁打开连接和关闭连接对数据库有一定的资源负荷,建立数据库连接耗时耗费资源,一个数据库服务器能够同时建立的连接数也是有限的,尤其应用压力较大时资源占用比较多容易产生性能问题。数据库连接池的意义在于,能够重复利用数据库连接,提高对请求的响应时间和服务器的性能。

一、Druid与其它流行连接池比较

数据库连接池————Druid的快速使用

  • C3p0:c3p0是一个易于使用的库,用于通过JNDI可绑定的数据源(包括实现连接和语句池的数据源)扩展传统的(基于DriverManager的)JDBC驱动程序,如jdbc3规范和jdbc2 std扩展所述。

  • DBCP:DBCP(DataBase connection pool)数据库连接池。是apache上的一个 java连接池项目,也是 tomcat使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。dbcp没有自动的去回收空闲连接的功能。

  • Tomcat Jdbc Pool:Tomcat JDBC池实现了异步检索连接的能力,而不向库本身添加额外的线程。Tomcat JDBC池是一个Tomcat模块,它依赖于Tomcat Juli,它是Tomcat中使用的一种简化日志记录框架。

  • BoneCP:BoneCP 是一个快速、免费而且开源的java数据库连接池(JDBC Pool)管理工具库。BoneCP很小,只有四十几K(运行时需要log4j和Google Collections的支持,这二者加起来就不小了),而相比之下C3P0 要六百多K。另外个人觉得 BoneCP 有个缺点是,JDBC驱动的加载是在连接池之外的,这样在一些应用服务器的配置上就不够灵活。

二、SpringBoot快速整合Druid

druid1.1.10之前版本配置(下有新版本配置)

  • 1、添加druid的依赖
  <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
  </dependency>

  • 2、配置数据源和druid连接池
#数据源配置
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test                     #url
    username:  root                                           #用户名
    password:  root                                        #密码
    driver-class-name: com.mysql.cj.jdbc.Driver               #数据库驱动
    type: com.alibaba.druid.pool.DruidDataSource              #Druid连接池
    druid:
        initial-size: 8                                       #初始化大小
        min-idle: 1                                           #最小连接数
        max-active: 20                                        #最大连接数
        max-wait: 60000                                       # 配置获取连接等待超时的时间
        time-between-eviction-runsMillis: 60000               # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        min-evictable-idle-timeMillis: 300000                 # 配置一个连接在池中最小生存的时间,单位是毫秒
        validation-query: select 'x' FROM DUAL
        test-while-idle: true
        test-on-borrow: false
        test-on-return: false
        pool-prepared-statements: true                        # 打开PSCache,并且指定每个连接上PSCache的大小
        max-open-prepared-statements: 20
        max-pool-prepared-statement-per-connection-size: 20
        filters: stat                                         # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000   # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
        use-global-data-source-stat: true                     # 合并多个DruidDataSource的监控数据
  • 3、初始化DataSource
	@Bean("duridDatasource")
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource druidDataSource() { return new DruidDataSource(); }
  • 4、配置监控拦截器
/**
 * 配置监控拦截器
 * druid监控拦截器
 */
@WebFilter(filterName="druidWebStatFilter",
        urlPatterns="/*",
        initParams={
                @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"),// 忽略资源
        })
public class DruidStatFilter extends WebStatFilter {

}
  • 5、配置druid监控视图
/**
 * druid监控视图配置
 */
@WebServlet(urlPatterns = "/druid/*", initParams={
        @WebInitParam(name="allow",value=""),// IP白名单 (没有配置或者为空,则允许所有访问)
        @WebInitParam(name="deny",value="192.168.x.x"),// IP黑名单 (存在共同时,deny优先于allow)
        @WebInitParam(name="loginUsername",value="root"),// 用户名
        @WebInitParam(name="loginPassword",value="root"),// 密码
        @WebInitParam(name="resetEnable",value="true")// 禁用HTML页面上的“Reset All”功能
})
public class DruidStatViewServlet extends StatViewServlet {
    private static final long serialVersionUID = 2359758657306626394L;
}

druid1.1.10及其之后新版本配置

  • 1、添加druid的依赖
  <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
  </dependency>
  • 2、配置数据源和druid连接池
      druid更新到1.1.10后,依赖变成了druid-spring-boot-starter,与此同时配置上带来了更大的便捷。DruidStatFilter和DruidStatViewServlet不需要在有具体代码的实现,可直接在application.yml中直接配置;
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test                     #url
    username:  root                                           #用户名
    password:  1234567                                        #密码
    driver-class-name: com.mysql.cj.jdbc.Driver               #数据库驱动
    type: com.alibaba.druid.pool.DruidDataSource              #Druid连接池
    druid:                                                    #连接池的配置信息
      # 初始化大小,最小,最大
      initial-size: 5
      min-idle: 5
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      validationQuery: SELECT 1
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      # 打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filters: stat,wall,slf4j
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      # 配置DruidStatFilter
      web-stat-filter:
        enabled: true
        url-pattern: "/*"
        exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
      # 配置DruidStatViewServlet
      stat-view-servlet:
        url-pattern: "/druid/*"
        # IP白名单(没有配置或者为空,则允许所有访问)
        allow:
        # IP黑名单 (存在共同时,deny优先于allow)
        deny: 192.168.1.73
        #  禁用HTML页面上的“Reset All”功能
        reset-enable: false
        # 登录名
        login-username: admin
        # 登录密码
        login-password: 123456
  • 运行查看是否配置成功:

访问:http://localhost:8080/druid/,登录名:stat-view-servlet里的login-username,密码:stat-view-servlet里的login-password
数据库连接池————Druid的快速使用
数据库连接池————Druid的快速使用


待续

相关标签: Java EE jdbc