es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

KnexTimeoutError: Knex: Tiempo de espera al adquirir una conexión

Obtengo el siguiente error al conectar con Knex:
KnexTimeoutError: Knex: Tiempo de espera para adquirir una conexión. Es probable que el grupo esté lleno. ¿Te falta una llamada .transacting(trx)?

Aquí está mi código:

Api.js

const Knex = require(‘knex’);
const config = require(‘./config’);
const configuration = {
user: config.config.sqlUser, // p. ej., ‘mi-usuario’
password: config.config.sqlPw, // p. ej., ‘mi-contraseña-de-usuario’
database: config.config.sqlDbName, // p. ej., ‘mi-base-de-datos’
};
configuration.host = ${config.config.sqlConnectionName};
const knex = Knex({client: ‘pg’, connection: configuration});
knex.client.pool.max = 5;
knex.client.pool.min = 5;
knex.client.pool.createTimeoutMillis = 30000; // 30 segundos
knex.client.pool.idleTimeoutMillis = 600000; // 10 minutos
knex.client.pool.createRetryIntervalMillis = 200; // 0.2 segundos
knex.client.pool.acquireTimeoutMillis = 600000; // 10 minutos

router.get(‘/cosas’, async (req, res) => {
await methods.getCosas(req, res, knex);
});

methods.js:

exports.getCosas = async (req, res, knex) => {
let response = {};
try {
console.log(“knex.client.pool.max”);
console.log(knex.client.pool.max);
response = await knex.select(‘id’, ‘userUid’, ‘firstName’, ‘lastName’, ‘cv’, ‘statement’, ‘country’, ‘represented’).from(‘cosas’).where(‘approved’, true);
} catch (err) {
console.log(“error: “, err);
return res.status(500).json(err);
}
return res.status(200).json(response);
}

Estoy utilizando:

Node v14.0.0
pg “8.7.1”
knex “0.95.14”

Parece que hay un problema al crear la conexión (30 segundos de tiempo de espera en los registros) a Cloud SQL. ¿Cómo puedo crear la conexión correctamente? ¿Debo usar cloud-proxy y cómo?

Tengo un script de inicio en VM que inicia un servidor de Node.js Express.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error “KnexTimeoutError: Knex: Tiempo de espera para adquirir una conexión. Probablemente la piscina está llena. ¿Falta una llamada .transacting(trx)?” indica que la piscina de conexiones está llena y no puede adquirir una nueva conexión.

    En el código proporcionado, el tamaño máximo de la piscina de conexiones se establece en 5. Si todas las conexiones de la piscina están en uso, entonces la piscina no puede adquirir una nueva conexión y agota el tiempo después de 30 segundos.

    Una solución a este problema es aumentar el tamaño de la piscina de conexiones. Sin embargo, esto puede no ser factible si la base de datos no puede manejar conexiones adicionales. Otra solución es usar un proxy de piscina de conexiones como cloud-sql-proxy.

    Cloud SQL Proxy ayuda a conectar a la base de datos de Cloud SQL desde fuera de la red de Google Cloud Platform. Proporciona acceso seguro a instancias de Cloud SQL de segunda generación sin necesidad de agregar direcciones IP a la lista blanca o configurar SSL.

    Para usar Cloud SQL Proxy, siga estos pasos:

    1. Descargue el archivo binario de Cloud SQL Proxy adecuado para su sistema operativo y arquitectura en https://cloud.google.com/sql/docs/mysql/sql-proxy#install
    2. Agregue permisos de ejecución al archivo binario usando chmod +x cloud_sql_proxy.

    3. Ejecute el proxy utilizando el siguiente comando ./cloud_sql_proxy -instances=<nombre_de_conexion_de_instancia>=tcp:3306. Reemplace <nombre_de_conexion_de_instancia> con el nombre de conexión de su instancia de Cloud SQL.

    4. Modifique el objeto configuration en Api.js para incluir la propiedad socketPath en lugar de la propiedad host.

    El código modificado se verá así:

    const Knex = require('knex');
    const config = require('./config');
    
    const connectionName = config.config.sqlConnectionName;
    const db_user = config.config.sqlUser;
    const db_password = config.config.sqlPw;
    const db_name = config.config.sqlDbName;
    
    // Crea una ruta de socket a partir del nombre de la conexión.
    const socketPath = `/cloudsql/${connectionName}`;
    
    const knex = Knex({
      client: 'pg',
      connection: {
        user: db_user,
        password: db_password,
        database: db_name,
        socketPath: socketPath,
      },
    });
    
    router.get('/cosas', async (req, res) => {
      await methods.getThings(req, res, knex);
    });
    

    Con estos cambios, el código debería usar Cloud SQL Proxy para conectarse a la base de datos y resolver el problema de tiempo de espera de conexión.

Comments are closed.