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