DEV Community

Vinícius Boscardin
Vinícius Boscardin

Posted on

Gerenciando o Pull de Conexões do banco de dados com Golang

Quando trabalhamos com bancos de dados em uma aplicação Go, é essencial gerenciar corretamente o pool de conexões para garantir que o sistema seja eficiente e escalável. O gerenciamento adequado do pool de conexões evita problemas de latência, erros de timeout e sobrecarga no banco de dados.

O que é um Pool de Conexões?

Um pool de conexões é uma técnica que permite reutilizar conexões com o banco de dados, evitando o custo de abrir e fechar conexões repetidamente. O Go, através do pacote database/sql, oferece suporte nativo para gerenciamento de conexões, criando um pool de conexões automaticamente.

Como Funciona o Gerenciamento de Conexões no Go

O pacote database/sql provê diversas funções para gerenciar o pool de conexões, controlando o número de conexões ativas e inativas, além do tempo de vida de cada conexão. As principais funções de gerenciamento são:

  • db.SetMaxOpenConns(n int): Define o número máximo de conexões abertas com o banco de dados. Se esse número for excedido, novas requisições de conexão serão enfileiradas até que uma conexão seja liberada.

  • db.SetMaxIdleConns(n int): Configura o número máximo de conexões inativas (conexões que estão abertas mas não estão sendo usadas). O valor padrão geralmente é 2.

  • db.SetConnMaxLifetime(d time.Duration): Define a duração máxima que uma conexão pode permanecer aberta, independentemente de estar ativa ou inativa. Conexões mais antigas que este valor serão descartadas.

  • db.SetConnMaxIdleTime(d time.Duration): Estabelece o tempo máximo que uma conexão pode ficar ociosa. Conexões que estiverem ociosas por mais tempo do que este limite serão fechadas. Esta função é útil para manter um número reduzido de conexões ociosas, evitando o uso desnecessário de recursos.

Exemplo de Configuração de Pool

Abaixo, um exemplo simples de como configurar o pool de conexões em uma aplicação Go utilizando todas as funções de gerenciamento disponíveis:

package main

import (
    "database/sql"
    "fmt"
    "log"
    "time"

    _ "github.com/lib/pq" // Importa o driver Postgres
)

func main() {
    // Abre a conexão com o banco de dados
    db, err := sql.Open("postgres", "user=usuario dbname=meubanco sslmode=disable")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // Configura o pool de conexões
    db.SetMaxOpenConns(50)             // Máximo de 50 conexões abertas
    db.SetMaxIdleConns(25)             // Máximo de 25 conexões inativas
    db.SetConnMaxLifetime(10 * time.Minute) // Conexões vivas por no máximo 10 minutos
    db.SetConnMaxIdleTime(5 * time.Minute)  // Conexões inativas por no máximo 5 minutos


}
Enter fullscreen mode Exit fullscreen mode

Estrutura sql.DBStats

A função db.Stats() retorna uma estrutura do tipo sql.DBStats, que contém as seguintes informações:

  • OpenConnections: O número total de conexões abertas atualmente, incluindo tanto as inativas quanto as ativas.
  • InUse: O número de conexões atualmente em uso, ou seja, conexões que estão sendo ativamente utilizadas pela aplicação.
  • Idle: O número de conexões inativas (disponíveis para reutilização no pool).
  • WaitCount: O número de vezes que a aplicação precisou esperar por uma nova conexão porque todas as conexões abertas estavam em uso. Esse número pode indicar que o limite de conexões abertas foi atingido.
  • WaitDuration: O tempo total que a aplicação passou esperando por uma conexão disponível. Um valor alto pode indicar que o sistema está atingindo o limite de conexões com frequência.
  • MaxIdleClosed: O número de conexões que foram fechadas automaticamente porque estavam ociosas por muito tempo e ultrapassaram o limite definido em SetConnMaxIdleTime.
  • MaxLifetimeClosed: O número de conexões que foram fechadas porque atingiram o limite máximo de tempo de vida definido em SetConnMaxLifetime.

Essas métricas são úteis para monitorar a saúde do pool de conexões e o desempenho da aplicação em relação ao banco de dados. Se houver muitos fechamentos de conexão por tempo de inatividade (MaxIdleClosed) ou tempo de vida excedido (MaxLifetimeClosed), isso pode ser um sinal de que a configuração do pool precisa ser ajustada.

Exemplo de Monitoramento do Pool de Conexões

Aqui está um exemplo de como você pode monitorar as estatísticas do pool de conexões em uma aplicação Go:

stats := db.Stats()
fmt.Printf("Conexões abertas: %d\n", stats.OpenConnections)
fmt.Printf("Conexões em uso: %d\n", stats.InUse)
fmt.Printf("Conexões inativas: %d\n", stats.Idle)
fmt.Printf("Vezes esperando por conexões: %d\n", stats.WaitCount)
fmt.Printf("Tempo esperando por conexões: %s\n", stats.WaitDuration)
fmt.Printf("Conexões fechadas por inatividade: %d\n", stats.MaxIdleClosed)
fmt.Printf("Conexões fechadas por tempo de vida: %d\n", stats.MaxLifetimeClosed)
Enter fullscreen mode Exit fullscreen mode

Top comments (1)

Collapse
 
jacksonsantin profile image
Jackson Dhanyel Santin

Very well!