首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Golang中缓存到不同Postgres/MySQL数据库的连接?

如何在Golang中缓存到不同Postgres/MySQL数据库的连接?
EN

Stack Overflow用户
提问于 2020-11-04 08:22:37
回答 4查看 706关注 0票数 7

我有一个应用程序,其中不同的用户可以连接到不同的数据库(这些数据库可以是MySQL或Postgres),什么是跨不同数据库缓存这些连接的最佳方式?我看到了一些连接池,但它们似乎更适合一个数据库多连接,而不是多个数据库多连接。

PS:为了增加更多的上下文,我正在设计一个多租户架构,每个租户连接到一个或多个数据库,我可以选择使用map[string]*sql.DB,其中关键字是数据库的url,但当我们有大量数据库时,它很难扩展。或者我们应该为每个传入的请求使用一个切片层,通过连接url进行切分,这样每台机器就可以包含适量的map[string]*sql.DB形式的数据库连接。

我想要构建的软件的一个示例是https://www.sigmacomputing.com/,其中用户可以连接到多个数据库来处理不同的表。

EN

回答 4

Stack Overflow用户

发布于 2020-11-04 17:40:39

MySQL和Postgres都不允许在多个数据库用户之间共享连接,连接凭据中指定了单个数据库用户。如果您的意思是不同的用户拥有自己的数据库凭据,那么就不可能在他们之间共享连接。

如果您所说的“不同用户”指的是您的应用程序用户,并且如果他们共享单个数据库用户以便在应用程序中更深入地访问DB,那么您不需要对“缓存”连接做任何特殊的操作。默认情况下,sql.DB会在其池中保留并重用打开的连接。

Go通过*database/sql.DB自动打开、关闭和重复使用DB连接。默认情况下,它最多保持2个连接打开(空闲),当所有打开的连接都已经繁忙时,它会在并发状态下打开无限数量的新连接。

如果您需要对池效率与数据库负载进行一些微调,则可能需要使用.Set*方法(例如SetMaxOpenConns )更改sql.DB配置。

票数 2
EN

Stack Overflow用户

发布于 2021-02-23 03:23:43

你似乎有很多未知数。在这样的情况下,我会应用好的、老的敏捷,并从你想要用你已经知道的工具实现的原型开始,然后对性能进行基准测试。我想你可能会惊讶于go的处理能力有多大。

既然您了解如何使用map[string]*sql.DB实现这一目的,我就同意这样做。你达到了一些极限吗?在haproxy后面添加另一台机器。解决伸缩问题并不意味着在go中编写新的db池。显然,如果你需要这种能力,你总是可以做到的- pgx postgres驱动有它自己的池实现,所以你可以在那里得到你的灵感。然而,现在这样做似乎是未成熟的优化--解决你还没有的问题。使用map[string]*sql.DB构建原型很容易,测试它,对它进行基准测试,你会发现你是否需要更多。

附注:顺便说一句,在耗尽内存之前,您很可能会达到第一个文件描述符限制。

票数 2
EN

Stack Overflow用户

发布于 2021-02-15 08:36:41

假设您有多个用户,其中多个数据库具有N对N的关系,那么您可以有一个数据库URL到数据库详细信息的映射(如下所述)。

事实上,哪些用户有权访问哪些数据库应该使用configmap或核心数据库来处理;对于数据库的详细信息,我们可以使用这样的结构:

代码语言:javascript
复制
type DBDetail {
 sync.RWMutex
 connection *sql.DB
}

该映射将是指向数据库详细信息 (dbDetail)的数据库URL,如果用户正在编写,则调用此映射:

代码语言:javascript
复制
dbDetail.Lock()
defer dbDetail.Unock()

对于读取,而不是上面的,只需使用RLock。

正如vearutop所说,连接可能是一件痛苦的事情,但是使用它,你可以有一个单一的连接,或者在锁之后,通过增加和减少另一个变量来设置限制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64672647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档