when to disconnect and when to end a pg client or pool

前端 未结 4 473
囚心锁ツ
囚心锁ツ 2021-02-01 02:38

My stack is node, express and the pg module. I really try to understand by the documentation and some outdated tutorials. I dont know when and how to disconnect and to e

4条回答
  •  太阳男子
    2021-02-01 03:21

    First, from the pg documentation*:

    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
          })
      })
    

    This code/construct is suficient/made to get your pool working, providing the your thing here things. If you shut down your application, the connection will hang normaly, since the pool is created well, exactly not to hang, even if it does provides a manual way of hanging, see last section of the article. Also look at the previous red section which says "You must always return the client..." to accept

    • the mandatory client.release() instruction
    • before accesing argument.
    • you scope/closure client within your callbacks.

    Then, from the pg.client documentation*:

    Plain text query with a promise

    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())
    

    seems to me the clearest syntax:

    • you end the client whatever the results.
    • you access the result before ending the client.
    • you don´t scope/closure the client within your callbacks

    It is this sort of oposition between the two syntaxes that may be confusing at first sight, but there is no magic in there, it is implementation construction syntax. Focus on your callbacks and queries, not on those constructs, just pick up the most elegant for your eyes and feed it with your code.

    *I added the comments // your xxx here for clarity

提交回复
热议问题