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 / dba / Perguntas / 36828
Accepted
Juan Carlos Coto
Juan Carlos Coto
Asked: 2013-03-14 14:15:01 +0800 CST2013-03-14 14:15:01 +0800 CST 2013-03-14 14:15:01 +0800 CST

Como usar melhor o pool de conexões no pool de nível de transação SQLAlchemy para PgBouncer?

  • 772

Usando SQLAlchemy para consultar um banco de dados PostgreSQL atrás de PgBouncer, usando pooling em nível de transação.

Qual é o melhor padrão a ser usado para esse tipo de configuração? Devo ter um mecanismo por processo, usando um ConnectionPool, ou devo criar um mecanismo por solicitação e usar NullPoolpara cada um deles? Existe um padrão completamente diferente que eu deveria usar?

Muito obrigado! Deixe-me saber se mais informações são necessárias e atualizarei o mais rápido possível.

postgresql python
  • 2 2 respostas
  • 17555 Views

2 respostas

  • Voted
  1. Best Answer
    zzzeek
    2013-03-15T10:41:32+08:002013-03-15T10:41:32+08:00

    com o PGBouncer, você provavelmente gostaria de ficar com o NullPool. Nesse caso, você poderá compartilhar um único mecanismo entre os subprocessos, pois nenhuma conexão de soquete será transportada para o limite do subprocesso. Mas você não pode compartilhar nada referente a um objeto Connection, como uma Session com uma transação ativa, além desse limite. Você definitivamente não gostaria de fazer "mecanismo por solicitação", porém, um mecanismo é um objeto caro que acumula muitas informações sobre um determinado URL de banco de dados na primeira vez que o vê.

    • 12
  2. eradman
    2015-10-15T22:59:42+08:002015-10-15T22:59:42+08:00

    Defina o nome do aplicativo

    Se você espera executar muitos processos, precisa saber de onde eles estão se conectando. O PGBouncer tornará isso invisível para pg_stat_activity. Resolva isso definindo cuidadosamente o application_namecom as informações necessárias:

    # Sets the application name for this connection in the form of
    #   application-name:user@host
    prog = os.path.basename(sys.argv[0]) or 'desjob'
    username = pwd.getpwuid (os.getuid ()).pw_name
    hostname = socket.gethostname().split(".")[0]·
    args.setdefault('connect_args', {'application_name': "%s:%s@%s" %
        (prog, username, hostname)})
    args.setdefault('isolation_level', "AUTOCOMMIT")
    engine = create_engine(url, **args)
    

    Preferir Sessões

    Use sessões, pois as solicitações de um objeto Engine podem gerar e manter várias conexões. Conectar-se ao Postgres não é muito caro, com o PGBouncer é ainda menos. Eu sempre usaria NullPoolpara que as únicas conexões que você verá no Postgres sejam as conexões que estão realmente sendo usadas.

    from sqlalchemy.pool import Pool, NullPool
    engine = create_engine(uri, poolclass=NullPool)
    

    Eliminar transações ociosas

    Se sua intenção é usar o PGBouncer para escalar, é imperativo que você evite deixar as transações travadas em aberto. autocommit Para fazer isso , você precisa ativar . Isso não é simples com o SQLAlchemy... existem três lugares onde algo chamado "autocommit" pode ser definido:

    psycopg2 autocommit

    conn = psycopg2.connect(uri)
    conn.autocommit = True
    

    Presume-se que não seja seguro porque o SQLAlchemy precisa saber o que está acontecendo por baixo.

    Sessão autocommit

    Session = sessionmaker(bind=engine, autocommit=True)
    session = Session()
    

    Isso requer uma entrega cuidadosa e explícita:

    session.begin()
    session.execute(...)
    session.rollback()
    

    A chamada de função e o tratamento de exceções são extremamente difíceis porque begin()não commit()podem ser aninhados:

    def A():
      session.begin()
      ...
      session.rollback()
    
    def B():
      session.begin()
      try:
          A() # error, already open
    

    Neste modo, psycopg2 autocommitparece ser False(o padrão)

    Confirmação automática do mecanismo

    Definir o modo de isolamento do mecanismo para "AUTOCOMMIT"ao criar o mecanismo estabelece um novo comportamento padrão que pode não exigir alterações no código existente.

    engine = create_engine(uri, isolation_level="AUTOCOMMIT")
    

    Neste modo, o psycopg2 autocommitparece serTrue

    O grande problema aqui é que a única forma de garantir que um bloco de código seja encapsulado em uma transação é emitir as instruções manualmente:

    session.execute("BEGIN")
    #...
    session.execute("COMMIT")
    
    • 8

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

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

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

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