diff --git a/packages/api/src/proc/connectProcess.js b/packages/api/src/proc/connectProcess.js index 91b42a421..f575acdd4 100644 --- a/packages/api/src/proc/connectProcess.js +++ b/packages/api/src/proc/connectProcess.js @@ -20,9 +20,10 @@ function start() { if (handleProcessCommunication(connection)) return; try { const driver = requireEngineDriver(connection); - const conn = await connectUtility(driver, connection, 'app'); - const res = await driver.getVersion(conn); + const dbhan = await connectUtility(driver, connection, 'app'); + const res = await driver.getVersion(dbhan); process.send({ msgtype: 'connected', ...res }); + await driver.close(dbhan); } catch (e) { console.error(e); process.send({ diff --git a/packages/api/src/proc/databaseConnectionProcess.js b/packages/api/src/proc/databaseConnectionProcess.js index 2ca9d4baf..d4a887e9c 100644 --- a/packages/api/src/proc/databaseConnectionProcess.js +++ b/packages/api/src/proc/databaseConnectionProcess.js @@ -329,8 +329,9 @@ async function handleSqlPreview({ msgid, objects, options }) { await generator.dump(); process.send({ msgtype: 'response', msgid, sql: dmp.s, isTruncated: generator.isTruncated }); if (generator.isUnhandledException) { - setTimeout(() => { + setTimeout(async () => { logger.error('Exiting because of unhandled exception'); + await driver.close(dbhan); process.exit(0); }, 500); } @@ -406,10 +407,12 @@ async function handleMessage({ msgtype, ...other }) { function start() { childProcessChecker(); - setInterval(() => { + setInterval(async () => { const time = new Date().getTime(); if (time - lastPing > 40 * 1000) { logger.info('Database connection not alive, exiting'); + const driver = requireEngineDriver(storedConnection); + await driver.close(dbhan); process.exit(0); } }, 10 * 1000); diff --git a/packages/api/src/proc/serverConnectionProcess.js b/packages/api/src/proc/serverConnectionProcess.js index b946f4643..831ed47c3 100644 --- a/packages/api/src/proc/serverConnectionProcess.js +++ b/packages/api/src/proc/serverConnectionProcess.js @@ -6,7 +6,7 @@ const connectUtility = require('../utility/connectUtility'); const { handleProcessCommunication } = require('../utility/processComm'); const logger = getLogger('srvconnProcess'); -let systemConnection; +let dbhan; let storedConnection; let lastDatabases = null; let lastStatus = null; @@ -16,7 +16,7 @@ let afterConnectCallbacks = []; async function handleRefresh() { const driver = requireEngineDriver(storedConnection); try { - let databases = await driver.listDatabases(systemConnection); + let databases = await driver.listDatabases(dbhan); if (storedConnection?.allowedDatabases?.trim()) { const allowedDatabaseList = storedConnection.allowedDatabases .split('\n') @@ -46,7 +46,7 @@ async function handleRefresh() { async function readVersion() { const driver = requireEngineDriver(storedConnection); - const version = await driver.getVersion(systemConnection); + const version = await driver.getVersion(dbhan); process.send({ msgtype: 'version', version }); } @@ -70,7 +70,7 @@ async function handleConnect(connection) { const driver = requireEngineDriver(storedConnection); try { - systemConnection = await connectUtility(driver, storedConnection, 'app'); + dbhan = await connectUtility(driver, storedConnection, 'app'); readVersion(); handleRefresh(); if (extractBoolSettingsValue(globalSettings, 'connection.autoRefresh', false)) { @@ -95,7 +95,7 @@ async function handleConnect(connection) { } function waitConnected() { - if (systemConnection) return Promise.resolve(); + if (dbhan) return Promise.resolve(); return new Promise((resolve, reject) => { afterConnectCallbacks.push([resolve, reject]); }); @@ -108,14 +108,14 @@ function handlePing() { async function handleDatabaseOp(op, { msgid, name }) { try { const driver = requireEngineDriver(storedConnection); - systemConnection = await connectUtility(driver, storedConnection, 'app'); + dbhan = await connectUtility(driver, storedConnection, 'app'); if (driver[op]) { - await driver[op](systemConnection, name); + await driver[op](dbhan, name); } else { const dmp = driver.createDumper(); dmp[op](name); logger.info({ sql: dmp.s }, 'Running script'); - await driver.query(systemConnection, dmp.s, { discardResult: true }); + await driver.query(dbhan, dmp.s, { discardResult: true }); } await handleRefresh(); @@ -137,11 +137,11 @@ async function handleDriverDataCore(msgid, callMethod) { } async function handleServerSummary({ msgid }) { - return handleDriverDataCore(msgid, driver => driver.serverSummary(systemConnection)); + return handleDriverDataCore(msgid, driver => driver.serverSummary(dbhan)); } async function handleSummaryCommand({ msgid, command, row }) { - return handleDriverDataCore(msgid, driver => driver.summaryCommand(systemConnection, command, row)); + return handleDriverDataCore(msgid, driver => driver.summaryCommand(dbhan, command, row)); } const messageHandlers = { @@ -161,10 +161,13 @@ async function handleMessage({ msgtype, ...other }) { function start() { childProcessChecker(); - setInterval(() => { + setInterval(async () => { const time = new Date().getTime(); if (time - lastPing > 40 * 1000) { + logger.info('Server connection not alive, exiting'); + const driver = requireEngineDriver(storedConnection); + await driver.close(dbhan); process.exit(0); } }, 10 * 1000); diff --git a/packages/api/src/proc/sessionProcess.js b/packages/api/src/proc/sessionProcess.js index 2f1975045..04997c43b 100644 --- a/packages/api/src/proc/sessionProcess.js +++ b/packages/api/src/proc/sessionProcess.js @@ -14,7 +14,7 @@ const { getLogger, extractIntSettingsValue, extractBoolSettingsValue } = require const logger = getLogger('sessionProcess'); -let systemConnection; +let dbhan; let storedConnection; let afterConnectCallbacks = []; // let currentHandlers = []; @@ -177,7 +177,7 @@ function handleStream(driver, resultIndexHolder, sqlItem) { return new Promise((resolve, reject) => { const start = sqlItem.trimStart || sqlItem.start; const handler = new StreamHandler(resultIndexHolder, resolve, start && start.line); - driver.stream(systemConnection, sqlItem.text, handler); + driver.stream(dbhan, sqlItem.text, handler); }); } @@ -196,7 +196,7 @@ async function handleConnect(connection) { storedConnection = connection; const driver = requireEngineDriver(storedConnection); - systemConnection = await connectUtility(driver, storedConnection, 'app'); + dbhan = await connectUtility(driver, storedConnection, 'app'); for (const [resolve] of afterConnectCallbacks) { resolve(); } @@ -210,7 +210,7 @@ async function handleConnect(connection) { // } function waitConnected() { - if (systemConnection) return Promise.resolve(); + if (dbhan) return Promise.resolve(); return new Promise((resolve, reject) => { afterConnectCallbacks.push([resolve, reject]); }); @@ -230,7 +230,7 @@ async function handleStartProfiler({ jslid }) { const writer = new TableWriter(); writer.initializeFromReader(jslid); - currentProfiler = await driver.startProfiler(systemConnection, { + currentProfiler = await driver.startProfiler(dbhan, { row: data => writer.rowFromReader(data), }); currentProfiler.writer = writer; @@ -241,7 +241,7 @@ async function handleStopProfiler({ jslid }) { const driver = requireEngineDriver(storedConnection); currentProfiler.writer.close(); - driver.stopProfiler(systemConnection, currentProfiler); + driver.stopProfiler(dbhan, currentProfiler); currentProfiler = null; } @@ -304,7 +304,7 @@ async function handleExecuteReader({ jslid, sql, fileName }) { const writer = new TableWriter(); writer.initializeFromReader(jslid); - const reader = await driver.readQuery(systemConnection, sql); + const reader = await driver.readQuery(dbhan, sql); reader.on('data', data => { writer.rowFromReader(data); @@ -340,10 +340,12 @@ function start() { lastPing = new Date().getTime(); - setInterval(() => { + setInterval(async () => { const time = new Date().getTime(); if (time - lastPing > 25 * 1000) { logger.info('Session not alive, exiting'); + const driver = requireEngineDriver(storedConnection); + await driver.close(dbhan); process.exit(0); } @@ -362,6 +364,8 @@ function start() { executingScripts == 0 ) { logger.info('Session not active, exiting'); + const driver = requireEngineDriver(storedConnection); + await driver.close(dbhan); process.exit(0); } }, 10 * 1000); diff --git a/plugins/dbgate-plugin-mysql/src/backend/drivers.js b/plugins/dbgate-plugin-mysql/src/backend/drivers.js index 66e739129..93c52bfa8 100644 --- a/plugins/dbgate-plugin-mysql/src/backend/drivers.js +++ b/plugins/dbgate-plugin-mysql/src/backend/drivers.js @@ -67,8 +67,10 @@ const drivers = driverBases.map(driverBase => ({ } return dbhan; }, - async close(dbhan) { - return dbhan.client.close(); + close(dbhan) { + return new Promise(resolve => { + dbhan.client.end(resolve); + }); }, query(dbhan, sql, options) { if (sql == null) {