Home
Download
Document
Forum
Video
Donate
Source Code
Sponsors
AI 助理
Products
Swoole-Compiler
CRMEB 新零售社交电商系统
Vprix 远程桌面系统
Login
Register
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
Hyperf 框架中如何快速释放 DB 连接
`Hyperf` 中 `Database` 连接池的设计,是在 `defer` 中释放连接到连接池,那么就会出现一种情况。 ``` // 读取用户信息 $user = User::query()->find(1); // 请求第三方接口 $client->request($user); // 保存用户信息 $user->save(); ``` 以上场景,就会导致 `DB` 连接一直在当前协程的上下文中,虽然中间请求第三方接口,耗时了很久,但其他协程都无法拿到当前的 `DB` 连接。这就导致,连接池内的连接数会被迅速消耗, 一旦时间过长,其他请求可能就会出现连接耗尽的异常。
发布于3年前 · 145 次浏览 · 来自
开发框架
李铭昕
`Hyperf` 中 `Database` 连接池的设计,是在 `defer` 中释放连接到连接池,那么就会出现一种情况。 ``` // 读取用户信息 $user = User::query()->find(1); // 请求第三方接口 $client->request($user); // 保存用户信息 $user->save(); ``` 以上场景,就会导致 `DB` 连接一直在当前协程的上下文中,虽然中间请求第三方接口,耗时了很久,但其他协程都无法拿到当前的 `DB` 连接。这就导致,连接池内的连接数会被迅速消耗, 一旦时间过长,其他请求可能就会出现连接耗尽的异常。
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2020-12-13
李铭昕
显而易见,我们只需要让读取用户信息的逻辑,跑在子协程中,然后配合 `Channel` 阻塞当前协程即可。 `v2.1` 里已经实现了这个方法,`v2.0` 中我们可以导入以下组件 ``` composer require gemini/waiter ``` 然后我们可以调用 `wait()` 方法,达成这个效果。 ``` // 读取用户信息 $user = wait(function() { return User::query()->find(1); }); // 请求第三方接口 $client->request($user); // 保存用户信息 $user->save(); ```
赞
4
回复
2023-04-27
JKD
请问,如果全部查询都使用wait,会不会对性能影响很大?
赞
0
回复
微信公众号
热门内容
作者其它话题
- 如何基于 Channel 实现多路复用
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。