sql >> Databasteknik >  >> RDS >> PostgreSQL

när man ska koppla från och när man ska avsluta en pg-klient eller pool

Först från siddokumentationen *:

const { Pool } = require('pg')

const pool = new Pool()

// the pool with emit an error on behalf of any idle clients
// it contains if a backend error or network partition happens
pool.on('error', (err, client) => {
  console.error('Unexpected error on idle client', err) // your callback here
  process.exit(-1)
})

// promise - checkout a client
pool.connect()
  .then(client => {
    return client.query('SELECT * FROM users WHERE id = $1', [1]) // your query string here
      .then(res => {
        client.release()
        console.log(res.rows[0]) // your callback here
      })
      .catch(e => {
        client.release()
        console.log(err.stack) // your callback here
      })
  })

Denna kod/konstruktion är tillräcklig /made för att få din pool att fungera, vilket ger din grej här saker. Om du stänger av din applikation kommer anslutningen att hänga normalt, eftersom poolen är skapad bra, precis för att inte hänga, även om den gör det ger ett manuellt sätt att hänga, se sista avsnittet av artikel . Titta även på föregående röda avsnitt som säger "Du måste alltid returnera klienten..." för att acceptera

  • den obligatoriska client.release() instruktion
  • innan argumentet öppnas.
  • du omfång/stänger klient inom dina återuppringningar.

, från pg.client-dokumentationen *:

Oformaterad fråga med ett löfte

const { Client } = require('pg').Client
const client = new Client()
client.connect()
client.query('SELECT NOW()') // your query string here
  .then(result => console.log(result)) // your callback here
  .catch(e => console.error(e.stack)) // your callback here
  .then(() => client.end())

förefaller mig den tydligaste syntaxen:

  • du avslutar klienten oavsett resultatet.
  • du kommer åt resultatet innan du slutar klienten.
  • du omfångar/stänger inte klienten i dina återuppringningar

Det är den här sortens oposition mellan de två syntaxerna som kan vara förvirrande vid första anblicken, men det finns ingen magi där, det är implementeringskonstruktionens syntax. Fokusera på din återuppringningar och frågor, inte om dessa konstruktioner, plocka bara upp det mest eleganta för dina ögon och mata det med din kod.

*Jag lade till kommentarerna // din xxx här för tydlighetens skull



  1. PostgreSQL flera transaktioner på samma anslutning

  2. Race Condition mellan SELECT och INSERT för flera kolumner

  3. DateTime2 vs DateTime i SQL Server

  4. Now() vs GetDate()