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

文章目录

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

相关推荐
微软技术分享几秒前
Ubuntu 本地部署Ollama+OpenWebUI教程
数据库·ubuntu·postgresql
ly768916 分钟前
MySQL 自增主键耗尽:从原理到应急恢复
数据库·mysql·innodb·故障恢复·自增主键·主键设计
文人sec25 分钟前
MySQL主库出问题了,从库怎么办?备库为什么会延迟好几个小时?
android·数据库·mysql
砚底藏山河1 小时前
【量化纯GET实战 #23】多股票相关性:用收益率看板块联动
java·数据库·python·金融·数据分析
Java小白笔记2 小时前
MySQL 8.0 常用内置函数用例
数据库·mysql·mybatis
ZGG0032 小时前
MySQL 索引详解:B+ 树、聚簇索引与最左前缀
java·数据库·mysql
勿忘,瞬间2 小时前
Mybatis高阶
java·数据库·mybatis
运维行者_3 小时前
ISP 企业级带宽计费怎么做?网络流量计费的 6 大核心能力
运维·服务器·网络·数据库·支持向量机·接口隔离原则
奇树谦3 小时前
PCB生产制造全流程详解:从开料、钻孔、沉铜到检测、包装
网络·数据库·制造
驾驭人生3 小时前
Hangfire.Redis.StackExchange 已归档停更!生产任务卡死、重复执行、网络抖动问题解决方案
数据库·redis·缓存