impress-2020/src/server/db.js
Matchu 4ed6344b3d Use a connection pool
This should both fix cases where the connection closes for various reasons, by having the pool reconnect; and also should be a second way of solving some of the blocking issues we were having with large queries, by letting faster queries use parallel connections.

Idk what a reasonable number is, 10 seems to be what various guides are saying? Might tune it down if it ends up pushing various connection limits? (We could also constrain it on dev specifically, if that matters.)
2022-01-08 09:20:45 -08:00

55 lines
1.4 KiB
JavaScript

import mysql from "mysql2";
let globalDbs = new Map();
// We usually run against the production database, even in local testing,
// to easily test against real data. (Not a wise general practice, but fine
// for this low-stakes project and small dev team with mostly read-only
// operations!)
//
// But you can also specify `DB_ENV=development` to use a local database,
// which is especially helpful for end-to-end modeling testing.
const defaultOptions =
process.env["DB_ENV"] === "development"
? {
host: "localhost",
user: "impress_2020_dev",
password: "impress_2020_dev",
database: "impress_2020_dev",
}
: {
host: "impress.openneo.net",
user: process.env["IMPRESS_MYSQL_USER"],
password: process.env["IMPRESS_MYSQL_PASSWORD"],
database: "openneo_impress",
};
async function connectToDb({
host = defaultOptions.host,
user = defaultOptions.user,
password = defaultOptions.password,
database = defaultOptions.database,
} = {}) {
if (globalDbs.has(host)) {
return globalDbs.get(host);
}
const db = mysql
.createPool({
host,
user,
password,
database,
multipleStatements: true,
connectionLimit: 10,
})
// We upgrade to promises here, instead of using the mysql2/promise import,
// for compatibility with Honeycomb's automatic tracing.
.promise();
globalDbs.set(host, db);
return db;
}
module.exports = connectToDb;