From c288c3936f128b332e7a563512c991ea8c0cf62b Mon Sep 17 00:00:00 2001 From: Roman Chistokhodov Date: Wed, 23 Jun 2021 16:49:01 +0300 Subject: [PATCH] Don't create new instance of postgres connection per each query (#1909) --- .../eventstore-postgresql/src/connect.ts | 12 ++++++++++++ .../eventstore-postgresql/src/dispose.ts | 7 +++++-- .../eventstore-postgresql/src/execute-statement.ts | 13 +------------ .../eventstore-postgresql/src/types.ts | 1 + 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/connect.ts b/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/connect.ts index 9e3ae2cd65..c1f2dbe6e9 100644 --- a/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/connect.ts +++ b/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/connect.ts @@ -37,6 +37,17 @@ const connect = async ( secretsTableName = secretsTableName ?? 'secrets' subscribersTableName = subscribersTableName ?? 'subscribers' + const connection = new Postgres({ + keepAlive: false, + connectionTimeoutMillis: 45000, + idle_in_transaction_session_timeout: 45000, + query_timeout: 45000, + statement_timeout: 45000, + ...connectionOptions, + }) + + await connection.connect() + Object.assign< AdapterPoolPrimal, Partial @@ -53,6 +64,7 @@ const connect = async ( executeStatement: executeStatement.bind(null, pool as AdapterPool), escapeId, escape, + connection, }) if (pool.executeStatement != null) { diff --git a/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/dispose.ts b/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/dispose.ts index c5163645d5..d88866eafd 100644 --- a/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/dispose.ts +++ b/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/dispose.ts @@ -1,8 +1,11 @@ import { getLog } from './get-log' +import { AdapterPool } from './types' -const dispose = async (): Promise => { +const dispose = async ({ connection }: AdapterPool): Promise => { const log = getLog(`dispose`) - log.debug(`disposing the adapter`) + log.debug(`disconnecting the event store adapter`) + await connection.end() + log.debug(`event store adapter disconnected`) } export default dispose diff --git a/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/execute-statement.ts b/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/execute-statement.ts index 6714366151..696bb4d543 100644 --- a/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/execute-statement.ts +++ b/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/execute-statement.ts @@ -4,18 +4,9 @@ import { AdapterPool } from './types' const executeStatement = async (pool: AdapterPool, sql: any): Promise => { const errors: any[] = [] let rows = null - const connection = new pool.Postgres({ - keepAlive: false, - connectionTimeoutMillis: 45000, - idle_in_transaction_session_timeout: 45000, - query_timeout: 45000, - statement_timeout: 45000, - ...pool.connectionOptions, - }) try { - await connection.connect() - const result = await connection.query(sql) + const result = await pool.connection.query(sql) if (result != null && Array.isArray(result.rows)) { rows = JSON.parse(JSON.stringify(result.rows)) @@ -24,8 +15,6 @@ const executeStatement = async (pool: AdapterPool, sql: any): Promise => { return rows } catch (error) { errors.push(error) - } finally { - await connection.end() } if (errors.length > 0) { diff --git a/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/types.ts b/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/types.ts index 092d7b21e1..040c39fc92 100644 --- a/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/types.ts +++ b/packages/runtime/adapters/eventstore-adapters/eventstore-postgresql/src/types.ts @@ -33,6 +33,7 @@ export type PostgresqlAdapterPoolConnectedProps = AdapterPoolConnectedProps & { executeStatement: (sql: string) => Promise escapeId: EscapeFunction escape: EscapeFunction + connection: Postgres } export type PostgresqlAdapterConfig = AdapterConfig & {