AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 76986363
Accepted
clarkk
clarkk
Asked: 2023-08-27 17:04:46 +0800 CST2023-08-27 17:04:46 +0800 CST 2023-08-27 17:04:46 +0800 CST

Como usar jackc/pgx com pool de conexão, contexto, instruções preparadas etc.

  • 772

Ainda não sou um especialista em golang e ainda estou aprendendo. Esta também é minha primeira experiência com postgresql

import "github.com/jackc/pgx/v5/pgxpool"

const DB = "postgres://postgres:xxx@localhost:5432/mydb?pool_min_conns=1&pool_max_conns=5&pool_max_conn_idle_time=30s"

dbpool, err := pgxpool.New(context.Background(), DB)
if err != nil {
    log.Fatal("Unable to create connection pool: "+err.Error())
}
defer dbpool.Close()

1. Como obter uma conexão do pool e usar instruções preparadas, onde você passa o SQL e os valores SQL como dois argumentos separados?

Vindo do PHP e nunca trabalhei com pooling de banco de dados antes.

2. Como garantir que quando você extrai uma conexão do pool seja "fresca" e não continue em uma transação anterior não concluída (reversão/confirmação)?

3. O mesmo acontece quando você libera uma conexão de volta ao pool. Ele fará uma reversão automaticamente se o contexto for cancelado ou se a solicitação falhar?

4. Como utilizar goroutines ao solicitar o banco de dados? É possível fazer consultas select paralelas na mesma transação ou todas as consultas precisam ser seriais? Acho que todas as consultas de gravação precisam ser seriais?

postgresql
  • 1 1 respostas
  • 34 Views

1 respostas

  • Voted
  1. Best Answer
    mkopriva
    2023-08-27T18:40:35+08:002023-08-27T18:40:35+08:00
    1. Como obter uma conexão do pool e usar instruções preparadas, onde você passa o SQL e os valores SQL como dois argumentos separados?

    Geralmente você não. O pool é responsável pelo gerenciamento das conexões (aquisição e liberação), bem como pelo gerenciamento das instruções preparadas (criação e armazenamento em cache).

    Se, no entanto, você quiser manter o controle, poderá adquirir explicitamente uma conexão do pool usando o Acquiremétodo ou qualquer um de seus métodos relacionados.

    Da mesma forma, se você quiser criar e reutilizar manualmente uma instrução preparada (por exemplo, você precisa executar a mesma consulta dentro de um loop apertado, mas não quer depender do cache de instruções preparadas do pool), então você pode usar o adquirido Connmétodo da conexão que retorna a *pgx.Connrepresentação da conexão e que possui um método chamado Prepare.

    1. Como garantir que quando você extrai uma conexão do pool seja "fresca" e não continue em uma transação anterior não concluída (reversão/confirmação)?

    Os métodos Acquire do pool retornam conexões disponíveis . Conexões que estão em uso, ou seja, não liberadas, estão, por definição, não disponíveis e não serão retornadas pelos métodos Acquire.

    1. O mesmo acontece quando você libera uma conexão de volta ao pool. Ele fará uma reversão automaticamente se o contexto for cancelado ou se a solicitação falhar?

    Os recursos mantidos por uma conexão liberada de volta ao pool, se não estiverem ociosos, serão destruídos . Em relação ao commit/rollback da transação, nenhum deles será chamado automaticamente, a documentação diz explicitamente: "Commit ou Rollback devem ser chamados na transação retornada para finalizar o bloco da transação."

    1. Como utilizar goroutines ao solicitar o banco de dados? É possível fazer consultas select paralelas na mesma transação ou todas as consultas precisam ser seriais? Acho que todas as consultas de gravação precisam ser seriais?

    A piscina é segura para uso simultâneo. No entanto, nem pgxpool.Connsão pgxpool.Txseguros para uso simultâneo.


    Exemplo:

    Beginnão possui suporte para auto-rollback nem auto-commit, você mesmo deve, conforme indicado na documentação , chamar Rollbackou Commitpara "finalizar o bloco de transação".

    func f(ctx context.Context, pool *pgxpool.Pool) (err error) {
        tx, err := pool.Begin(ctx)
        if err != nil {
            return err
        }
        defer func() {
            if err != nil {
                tx.Rollback(ctx)
            } else {
                tx.Commit(ctx)
            }
        }()
    
        _, err := tx.Exec(ctx, "insert into users (email) values ($1)", "[email protected]")
        if err != nil {
            return err
        }
    
        var id int
        row := tx.QueryRow(ctx, "select id from users where email = $1", "[email protected]")
        if err := row.Scan(&id); err != nil {
            return err
        }
    
        // NOTE: the above is just an example, if you need the auto
        // generated id of an inserted record, please use the RETURNING
        // clause supported by PostgreSQL.
        return nil
    }
    

    No entanto, você pode usar BeginFuncse quiser que o pgx Rollbackou Commita transação seja para você.

    func f(ctx context.Context, pool *pgxpool.Pool) (err error) {
        return pool.BeginFunc(ctx, func(tx pgx.Tx) error {
            _, err := tx.Exec(ctx, "insert into users (email) values ($1)", "[email protected]")
            if err != nil {
                return err
            }
    
            var id int
            row := tx.QueryRow(ctx, "select id from users where email = $1", "[email protected]")
            if err := row.Scan(&id); err != nil {
                return err
            }
    
            // NOTE: the above is just an example, if you need the auto
            // generated id of an inserted record, please use the RETURNING
            // clause supported by PostgreSQL.
            return nil
        })
    }
    
    • 2

relate perguntas

  • Escreva uma consulta psql para localizar usuários em um intervalo de tempo

  • O caractere de escape de barra invertida do Postgresql não funciona para vírgulas em COPY FROM

  • biblioteca postgresql não encontrada no contêiner docker baseado em clojure

  • A inserção do Postgres está acontecendo apesar de violar a restrição de índice parcial

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve