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

文章目录

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,就可以实现线程都使用自己独立的数据库连接。

相关推荐
DFT计算杂谈23 分钟前
vasp如何计算金属的铁电极化强度?
数据库
EterNity_TiMe_32 分钟前
别让告警变成噪音:用Prometheus和Alertmanager搭一套可远程查看的监控系统
数据库·人工智能·ai·postgresql·prometheus·cpolar
不超限1 小时前
Postgresql 数据库 自增字段,Vastbase 无效的问题
数据库
阿坤带你走近大数据1 小时前
Oracle新老SQL写法对比
数据库·sql·oracle
自由的裙子1 小时前
How-To: Using the N* Stack, part 4
java·jvm·oracle
努力努力再努力wz2 小时前
【高性能网络库与HTTP Server系列】:基于主从 Reactor 模型实现高性能 C++ 网络库与 HTTP Server
开发语言·网络·数据结构·数据库·c++·网络协议·http
HackTwoHub2 小时前
某单位 CMS 完整渗透链、SQL 注入→后台拿权→绕过宝塔 Waf 上线 shell
数据库·人工智能·sql·安全·网络安全·系统安全·安全架构
Elastic 中国社区官方博客3 小时前
使用 Elasticsearch 作为 Grafana 的直接替代 Prometheus 后端
大数据·数据库·sql·elasticsearch·搜索引擎·grafana·prometheus
杨婷1233 小时前
2026 企业微信会话存档服务商选型指南:一维助手方案深度解析
大数据·数据库·企业微信
霸道流氓气质3 小时前
Kiro 配置 MySQL MCP Server 通用教程
数据库·mysql·adb·mcp·kiro