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.
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:
Agregue permisos de ejecución al archivo binario usando
chmod +x cloud_sql_proxy
.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.Modifique el objeto
configuration
enApi.js
para incluir la propiedadsocketPath
en lugar de la propiedadhost
.El código modificado se verá así:
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.