关于数据库连接池和线程,记录几个问题

文章目录

1.HirakiPool - Connection is not available, request timed out after

该问题的原因是由于连接池中没有了可用的连接,一致等到超过connectionTimeout设置的时间后还是没有获取到连接,然后就会抛出异常(SQLTransientConnectionException)

再详细讲解可以参考:Connection is not available, request timed out after

2.在一个线程内,调用多次dataSource.getConnection()

在一个线程内,调用多次dataSource.getConnection()时,每次调用都是返回一个新的连接对象,并没有做到线程内复用连接的功能;如果我们使用spring的JbdcTemplate来执行sql时,它所使用的Connection则是线程内唯一的连接。

这是为什么呢?是谁来实现的线程内连接唯一呢?

HirakiDataSource连接池,获取连接的逻辑是这样的,Hiraki的HirakiPool类中有一个字段**ConcurrentBag connectionBag;**用来维护当前线程的数据库连接,当我们获取连接时会先从这个里边获取连接 如果获取不到则会新建一个连接然后将获取的新连接保存到connectionBag,之后将保存的对象返回给调用方;这个地方就会有一个点需要注意就是源码使用ConcurrentBag来维护线程的集合,且使用ConcurrentBag.borrow方法获取数据库连接对象,必须调用ConcurrentBag.requite方法将获取的连接放回容器,否则会导致内存泄露。

在Spring框架中,JdbcTemplate内部确实使用了DataSourceUtils.getConnection(dataSource)来获取数据库连接,并且在多线程环境下,JdbcTemplate能够确保每个线程都使用自己独立的数据库连接。

其中逻辑在于JdbcTemplate使用DataSourceUtils.getConnection(dataSource)来获取数据库连接,然后使用完后调用DataSourceUtils.releaseConnection(con, getDataSource());将数据库连接放回ConcurrentBag,就可以实现线程都使用自己独立的数据库连接。

相关推荐
倔强的石头_15 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再5 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest5 天前
数据库SQL学习
数据库·sql