JAVA:Springboot 装配数据库Hikari和Druid连接池

1、JDBC

Java数据库连接(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
JDBC API主要位于JDK中的java.sql包中(之后扩展的内容位于javax.sql包中),主要包括:

  • DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。
  • Driver:驱动程序,会将自身加载到DriverManager中去,并处理相应的请求并返回相应的数据库连接(Connection)。
  • Connection:数据库连接,负责与进行数据库间通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement
  • Statement:用以执行SQL查询和更新(针对静态SQL语句和单次执行)。
  • PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)。
  • CallableStatement:用以调用数据库中的存储过程。
  • SQLException:代表在数据库连接的建立和关闭和SQL语句的执行过程中发生了例外情况。

在Java这个自由开放的生态中,已经有非常多优秀的开源数据源可以供大家选择,比如:DBCP、C3P0、Druid、HikariCP等。以下图是开源数据源的对比图:
在这里插入图片描述
当前文章主要介绍Hikari和Druid连接池。

2、Hikari

Hikari 是Springboot 2.0 默认的连接池,所以我们不用加额外的依赖,现在C3P0已经很久没有更新了, 而Druid 和 HikariCP 处于活跃状态的更新中。他自身也有以下几点优势:

  • 字节码精简 :优化代码,直到编译后的字节码最少,这样,CPU缓存可以加载更多的程序代码;

  • 优化代理和拦截器 :减少代码,例如 HikariCP 的 Statement proxy只有 100 行代码,只有 BoneCP 的十分之一;

  • 自定义数组类型(FastStatementList)代替ArrayList :避免每次get() 调用都要进行 range check,避免调用 remove() 时的从头到尾的扫描;

  • 自定义集合类型 ConcurrentBag :提高并发读写的效率;

  • 其他针对 BoneCP 缺陷的优化。

使用的时候,我们只要在application.yml添加配置即可:

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: shdxhl
    password: shdxhl
    url: jdbc:mysql://192.168.254.128:3306/sys_xhl?characterEncoding=utf-8&useSSL=false
    hikari:
      # 连接只读数据库时配置为true, 保证安全
      read-only: true
      # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
      connection-timeout: 30000
      # 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
      idle-timeout: 600000
      # 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒
      max-lifetime: 1800000
      # 连接池中允许的最大连接数。缺省值:10
      maximum-pool-size: 60
      minimum-idle: 10

3、Druid

Druid是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。

Druid 提供性能卓越的连接池功能外,还集成了SQL监控,黑名单拦截等功能,强大的监控特性,通过 Druid 提供的监控功能,可以清楚知道连接池和 SQL 的工作情况。

Druid 集合了开源和商业数据库连接池的优秀特性,并结合阿里巴巴大规模苛刻生产环境的使用经验进行优化。

  • 替换 DBCP 和 C3P0。Druid 提供了一个高效、功能强大、可扩展性好的数据库连接池。

  • 可以监控数据库访问性能,Druid 内置提供了一个功能强大的StatFilter 插件,能够详细统计 SQL 的执行性能,这对于线上分析数据库访问性能有帮助。

  • 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver 和 DruidDataSource 都支持 PasswordCallback。

  • SQL 执行日志,Druid 提供了不同的 LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。

  • 扩展JDBC,如果你要对JDBC层有编程的需求,可以通过 Druid提供的Filter机制,很方便编写JDBC层的扩展插件。

Springboot要集成Druid需要在pom.xml引用:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.16</version>
</dependency>

然后再application.yml配置druid,并指定对应的type:

spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        druid:
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://192.168.254.128:3306/sys_xhl?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
            username: shdxhl
            password: shdxhl
            initial-size: 10
            max-active: 100
            min-idle: 10
            max-wait: 60000
            pool-prepared-statements: true
            max-pool-prepared-statement-per-connection-size: 20
            time-between-eviction-runs-millis: 60000
            min-evictable-idle-time-millis: 300000
            #Oracle需要打开注释
            #validation-query: SELECT 1 FROM DUAL
            test-while-idle: true
            test-on-borrow: false
            test-on-return: false
            stat-view-servlet:
                enabled: true
                url-pattern: /druid/*
                #login-username: admin
                #login-password: admin
            filter:
                stat:
                    log-slow-sql: true
                    slow-sql-millis: 1000
                    merge-sql: false
                wall:
                    config:
                        multi-statement-allow: true

4、性能

在性能方面:HikariCP因为细节方面优化力度较大,性能方面强于Druid

hikariCP>druid>tomcat-jdbc>proxool>dbcp>c3p0

hikariCP

  • hikariCP 的性能十分优异,号称java平台最快的数据库连接池。
  • hikariCP在并发较高的情况下,性能基本上没有下降。
  • 从字节码的维度优化代码。让方法尽量在35个字节码以下,来提升jvm的处理效率。 (default inline threshold for a JVM running the server Hotspot compiler is 35 bytecodes )
  • HiKariCP性能比Druid高
  • HiKariCP是Spring Boot 2+官方支持并默认内置,就像jackson一样,和Spring Boot兼容性更好

Druid

  • Druid的优势是监控完善,扩展性更好
  • 功能丰富程度方面:Druid功能更全面除了具有连接池的基本功能以外,还支持sql级监控,支持扩展,防止SQL注入等功能。
  • 可视化监控,统计数据较为全面。

使用热度:Druid在国内使用较多,国内有很多生产实践。HikariCP是spring boot 2.0以后默认连接池,在国外使用较多

猜你喜欢

转载自blog.csdn.net/lishangke/article/details/130548902
今日推荐