3 个协程,2 个池化连接 — 通过 $stmt 和事务自动管理

代码 — 一个带连接池的 PDO,3 个协程
// 一个 PDO 对象,连接池大小为 2
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_POOL_ENABLED => true,
PDO::ATTR_POOL_MAX => 2,
]);
for ($i = 1; $i <= 3; $i++) {
spawn(function() use ($pdo, $i) {
// prepare() 自动从连接池获取连接
$stmt = $pdo->prepare("SELECT * FROM users WHERE id=?");
$stmt->execute([$i]); // 等待数据库响应
$user = $stmt->fetch();
processUser($user);
// $stmt 离开作用域 -> refcount=0
// 连接自动归还连接池!
});
}
PDO Pool (ATTR_POOL_MAX: 2)
🔌
连接 #1
空闲
🔌
连接 #2
空闲
等待队列:
协程 1
就绪
协程 2
就绪
协程 3
就绪
执行时间线 0 ms
协程 1
协程 2
协程 3
015304555ms
CPU 工作中
等待数据库
等待连接池
0 ms
总耗时
0 ms
数据库等待
0 ms
连接池等待
0 ms
节省时间

点击"播放"开始

此可视化展示了 PDO 连接池如何自动管理资源。 当 $stmt 存在或事务处于活动状态时,连接会被锁定。 当 $stmt 被销毁且没有活动事务时,连接会自动归还到连接池。