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

news/2024/11/27 2:09:03/

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.Driverusername: shdxhlpassword: shdxhlurl: jdbc:mysql://192.168.254.128:3306/sys_xhl?characterEncoding=utf-8&useSSL=falsehikari:# 连接只读数据库时配置为true, 保证安全read-only: true# 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒connection-timeout: 30000# 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟idle-timeout: 600000# 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒max-lifetime: 1800000# 连接池中允许的最大连接数。缺省值:10maximum-pool-size: 60minimum-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.DruidDataSourcedruid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.254.128:3306/sys_xhl?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaiusername: shdxhlpassword: shdxhlinitial-size: 10max-active: 100min-idle: 10max-wait: 60000pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000#Oracle需要打开注释#validation-query: SELECT 1 FROM DUALtest-while-idle: truetest-on-borrow: falsetest-on-return: falsestat-view-servlet:enabled: trueurl-pattern: /druid/*#login-username: admin#login-password: adminfilter:stat:log-slow-sql: trueslow-sql-millis: 1000merge-sql: falsewall: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以后默认连接池,在国外使用较多


http://www.ppmy.cn/news/61908.html

相关文章

程序员为什么应该写技术博客?

程序员为什么应该写技术博客&#xff1f; 一 用代码进行同行间的交流 把自己的经验分享出来&#xff0c;帮助他人的同时&#xff0c;提升自己的影响力。 二 直接有助于编程技能的提升 对过去的工作经验的总结与回顾&#xff0c;才能巩固编程技能。进而提炼出 编程的方法论。…

提取手机号从文档中

import redef extract_phone_numbers(text):# 中国手机号正则表达式pattern r"(?<!\d)(1[3-9]\d{9})(?!\d)"# 提取出所有匹配项phone_numbers re.findall(pattern, text)return phone_numberstext "张三的手机号码是13800138000&#xff0c;李四的手机号…

【Spring框架一】——Spring框架简介

系列文章目录 Spring框架简介 系列文章目录前言一、什么是Spring框架&#xff1f;二、Spring框架的优势1.简化开发流程&#xff1a;Spring提供了许多现成的功能&#xff0c;可以使得开发人员在构建应用程序时减少编写重复代码的工作。2.提高可维护性&#xff1a;Spring框架采用…

【ADS867x】双极输入范围 14 位 500kSPS 4/8 通道、单电源 SAR ADC

器件特性 具有集成模拟前端的 14 位模数转换器 (ADC)具有自动和手动扫描功能的 4 通道、8 通道多路复用器通道独立可编程输入&#xff1a; 10.24V、5.12V、2.56V、1.28V、0.64V10.24V、5.12V、2.56V、1.28V 5V 模拟电源&#xff1a;1.65V 到 5V I/O 电源恒定的阻性输入阻抗&am…

不扯犊子!我们自己来读技术报告,了解真实的GPT-4

上周g p t 4发布了 有人赞不绝口 有人瞟了一眼就嗤之以鼻 毫不讳言 我就是那种倍感震撼的人 不是因为我看到GDP4的报道才激动 而是从GTP3开始 当时扩展出AIGC 就是成为人工智能生存内容 那个时候呢就让我深深的震撼了 从2018年GPT1问四到2019年GPT2再到2020年GPT3 一年一个新版…

BadUsb使用

1 IDE下载 地址&#xff1a;Software | Arduino 2 开发版驱动安装 linux和mac版本会自动识别提示你安装开发板&#xff0c;驱动貌似不需要额外安装 win需要根据板子型号去下载安装驱动 如 Arduino驱动的安装教程-DFRobot产品资料库 默认会提示你根据你插入的设备进行提示…

端口聚合与Hash算法

目录 前言 一、Hash算法简介 二、负载分担 1.逐流负载分担 2.逐包负载分担 三、Hash算法与负载分担 1.转发原理 四、堆叠情况下的负载分担 五、配置流程 前言 提示&#xff1a;关于Hash与负载分担方式 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供…

【工具使用】- git实现gitee托管代码以及检出代码

1. 下载Git工具 git下载地址1&#xff1a;https://git-scm.com/download/win git下载2&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/github-release/git-for-windows/git/Git%20for%20Windows%202.40.1/ 下载完成后安装 安装直接执行exe可执行程序&#xff0c;下一步…