HikariDataSource连接池针对线程做缓存

问题背景

偶然发现,在spring中没有启用事务的情况下,执行完oracle存储过程后(过程中写入临时表),依然能读取到临时表内容,这说明两次读取用的是同一个连接。查看HikariCp后发现,连接池会对当前线程所使用的连接做缓存。

获取连接

HikariDataSource在获取数据库连接时,查看threadList是否有可用的连接,有则使用当前线程已经缓存的连接

在这里插入图片描述

关闭连接

在关闭连接时,把数据库连接放入threadList,下次该线程继续读取数据库时,优先从threadList取出

在这里插入图片描述

### HikariDataSource 的配置方法及参数说明 #### 1. 引入依赖 为了使用 HikariDataSource,在项目中需要引入相应的 Maven 或 Gradle 依赖。以下是 Spring Boot 默认支持的 MySQL 数据库连接器的相关依赖: ```xml <!-- Maven --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> ``` 如果使用的是 Gradle,则可以这样写: ```gradle // Gradle implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'mysql:mysql-connector-java' ``` 上述操作会自动加载 HikariCP 并将其作为默认的数据源[^2]。 --- #### 2. 配置文件设置 在 `application.yml` 文件中完成数据库的基本配置,如下所示: ```yaml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: your_username password: your_password type: com.zaxxer.hikari.HikariDataSource # 明确指定数据源类型为 HikariDataSource hikari: connection-timeout: 20000 # 连接超时时间(毫秒) maximum-pool-size: 10 # 最大连接池大小 minimum-idle: 5 # 最小空闲连接数 idle-timeout: 30000 # 空闲连接超时时间(毫秒) max-lifetime: 600000 # 单个连接的最大生命周期(毫秒) auto-commit: true # 是否启用自动提交模式 pool-name: MyHikariPool # 自定义连接池名称 data-source-properties: cachePrepStmts: true # 缓存预处理语句开关 prepStmtCacheSize: 250 # 缓存预处理语句的数量 prepStmtCacheSqlLimit: 2048 # 可缓存的单条 SQL 大小限制(字节) ``` 以上配置项解释如下: - **connection-timeout**: 设置等待获取新连接的时间上限,默认值通常为 30 秒。 - **maximum-pool-size**: 控制最大并发线程数量,建议根据实际硬件资源调整。 - **minimum-idle**: 维持最小空闲连接数,防止频繁创建销毁连接。 - **idle-timeout**: 超过该时间未使用的连接会被关闭并回收到池中。 - **max-lifetime**: 单一连接最长存活时间,超过此时间后强制关闭。 - **pool-name**: 提供自定义命名以便于调试和监控。 - **data-source-properties**: 扩展属性用于优化性能或满足特定需求。 这些参数可以通过官方文档进一步查阅其含义与最佳实践[^3]。 --- #### 3. 使用 JdbcTemplate 实现 CRUD 操作 一旦完成了基础配置,就可以利用 Spring 提供的工具类来执行数据库查询或其他操作。下面是一个基于 JdbcTemplate 的简单例子: ```java @Controller public class DatabaseController { @Autowired private JdbcTemplate jdbcTemplate; @GetMapping("/fetchData") @ResponseBody public List<Furn> fetchData() { String sql = "SELECT * FROM furn"; BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class); return jdbcTemplate.query(sql, rowMapper); } } ``` 在此代码片段中,JdbcTemplate 已经被绑定到了 HikariDataSource 上,并能无缝工作[^4]。 --- ####
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘茶蛙泳

just 4 fun

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值