【发布时间】:2020-05-30 02:46:43
【问题描述】:
我最感兴趣的是一般概念,但具体来说,我需要了解这个概念才能学习使用 Swift/Vapor 进行服务器端编程。但即使您不了解 Swift/Vapor,也可以得到一个通用的答案。
我发现为了连接数据库,我可以使用这两种方法:
func requestPooledConnection<Database>(to dbid: DatabaseIdentifier<Database>) -> Future<Database.Connection>
func requestCachedConnection<Database>(to database: DatabaseIdentifier<Database>) -> Future<Database.Connection>
现在我从文档中了解到的(来源:https://docs.vapor.codes/3.0/database-kit/overview/#pools)是:
- 通过池化,我可以重用现有连接,如果不存在则创建一个新连接
- 使用池连接不会在事件循环之间共享,以防止出现竞争条件
- 通常每个事件循环每个数据库有一个池
- 使用缓存,每个数据库 ID 获得一个连接
现在这有点令人困惑,特别是“通常”一词,我还尝试搜索有关一般概念的更多文档(例如https://en.wikipedia.org/wiki/Connection_pool),看起来“缓存”和“池化”这两个词可以互换使用有时。现在我有兴趣了解差异,因为这对于正确优化我的 Web 服务很有用。但在我看来——至少就我如何理解 Vapor 的文档而言——它们是非常相似的概念,我不明白其中的区别。有人可以澄清一下吗?
【问题讨论】: