暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

拾荒的小海螺 2023-05-08
2460

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以后默认连接池,在国外使用较多


          文章转载自拾荒的小海螺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论