【问题标题】:Should I always have 1 global database connection open in a Go web app? Or should I open and close it each time? [duplicate]我是否应该在 Go Web 应用程序中始终打开 1 个全局数据库连接?或者我应该每次打开和关闭它? [复制]
【发布时间】:2020-04-15 05:10:16
【问题描述】:

Go 中的 web 应用程序。假设它是一个博客。假设每天有 1000 个会话。

我应该创建一个全局数据库连接并让它一直处于活动状态吗?还是应该在每次需要查询数据库时打开和关闭它?一般规则是什么?

【问题讨论】:

  • golang.org/pkg/database/sql/#Open "返回的 DB 对于多个 goroutine 并发使用是安全的,并维护自己的空闲连接池。因此,Open 函数应该只调用一次。很少需要关闭数据库。"
  • 您绝对应该每次都打开和关闭。您是否有单个连接更多是一个应用问题。一些应用程序需要多个连接(即到不同的数据库,或使用不同的凭据)

标签: mysql database postgresql go web-applications


【解决方案1】:

您应该使用 sql 连接池来管理您的连接。 Golang database/sql 包提供了一种管理连接池的机制。在 database/sql 包中配置你的 maxIdle 参数,这样你就可以管理你的空闲连接池,以便在新的连接请求到来时重用。当连接池中没有空闲连接时,连接池会自动打开一个新连接。

【讨论】:

  • 如何使用连接池?
【解决方案2】:

您应该为每个应用创建一个全局连接对象。此连接对象配置有连接池。根据给定的配置,每个连接对象都包含一定数量的连接。

如果您为每个请求创建和删除它,它将为每个请求创建和销毁连接池。

只需使用单例模式创建一个具有所需配置的全局连接对象,它就会在内部为您管理连接池。

另外,处理您的应用程序的正常关闭。当您收到应用程序终止操作的信号时,请确保正确关闭全局连接对象。像这样:-

    shutdown := make(chan os.Signal, 1)
    signal.Notify(shutdown, syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL)
    <-shutdown
    connection.Close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 2011-11-24
    • 2011-06-19
    • 2014-01-30
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多