Skip to content

Commit d94e77e

Browse files
committed
fix(prisma): add pool_timeout=30 and retry on connection pool timeout
The default pool_timeout (10s) is insufficient for Aurora Serverless v2 auto-pause resume (~15s). Also, PrismaClientInitializationError for pool timeout has errorCode=undefined, so message-based detection is needed.
1 parent db668e9 commit d94e77e

File tree

4 files changed

+15
-13
lines changed

4 files changed

+15
-13
lines changed

cdk/lib/constructs/database.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,10 @@ export class Database extends Construct implements ec2.IConnectable {
9191
public getLambdaEnvironment(databaseName: string) {
9292
const conn = this.getConnectionInfo();
9393
// connection_limit=1: Each Lambda instance handles one request at a time
94+
// pool_timeout=30: Must be >= connect_timeout to allow Aurora Serverless v2 resume (~15s)
9495
// connect_timeout=30: Aurora Serverless v2 auto-pause resume takes ~15s (longer after 24h+ pause)
9596
// https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2-auto-pause.html
96-
const option = '?connection_limit=1&connect_timeout=30';
97+
const option = '?connection_limit=1&pool_timeout=30&connect_timeout=30';
9798
return {
9899
DATABASE_HOST: conn.host,
99100
DATABASE_NAME: databaseName,

cdk/test/__snapshots__/serverless-fullstack-webapp-starter-kit-without-domain.test.ts.snap

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,7 @@ exports[`Snapshot test 2`] = `
723723
],
724724
},
725725
"DATABASE_NAME": "main",
726-
"DATABASE_OPTION": "?connection_limit=1&connect_timeout=30",
726+
"DATABASE_OPTION": "?connection_limit=1&pool_timeout=30&connect_timeout=30",
727727
"DATABASE_PASSWORD": {
728728
"Fn::Join": [
729729
"",
@@ -772,7 +772,7 @@ exports[`Snapshot test 2`] = `
772772
"Endpoint.Port",
773773
],
774774
},
775-
"/main?connection_limit=1&connect_timeout=30",
775+
"/main?connection_limit=1&pool_timeout=30&connect_timeout=30",
776776
],
777777
],
778778
},
@@ -3465,7 +3465,7 @@ async function handler(event) {
34653465
],
34663466
},
34673467
"DATABASE_NAME": "main",
3468-
"DATABASE_OPTION": "?connection_limit=1&connect_timeout=30",
3468+
"DATABASE_OPTION": "?connection_limit=1&pool_timeout=30&connect_timeout=30",
34693469
"DATABASE_PASSWORD": {
34703470
"Fn::Join": [
34713471
"",
@@ -3514,7 +3514,7 @@ async function handler(event) {
35143514
"Endpoint.Port",
35153515
],
35163516
},
3517-
"/main?connection_limit=1&connect_timeout=30",
3517+
"/main?connection_limit=1&pool_timeout=30&connect_timeout=30",
35183518
],
35193519
],
35203520
},
@@ -3842,7 +3842,7 @@ async function handler(event) {
38423842
],
38433843
},
38443844
"DATABASE_NAME": "main",
3845-
"DATABASE_OPTION": "?connection_limit=1&connect_timeout=30",
3845+
"DATABASE_OPTION": "?connection_limit=1&pool_timeout=30&connect_timeout=30",
38463846
"DATABASE_PASSWORD": {
38473847
"Fn::Join": [
38483848
"",
@@ -3891,7 +3891,7 @@ async function handler(event) {
38913891
"Endpoint.Port",
38923892
],
38933893
},
3894-
"/main?connection_limit=1&connect_timeout=30",
3894+
"/main?connection_limit=1&pool_timeout=30&connect_timeout=30",
38953895
],
38963896
],
38973897
},

cdk/test/__snapshots__/serverless-fullstack-webapp-starter-kit.test.ts.snap

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -744,7 +744,7 @@ exports[`Snapshot test 2`] = `
744744
],
745745
},
746746
"DATABASE_NAME": "main",
747-
"DATABASE_OPTION": "?connection_limit=1&connect_timeout=30",
747+
"DATABASE_OPTION": "?connection_limit=1&pool_timeout=30&connect_timeout=30",
748748
"DATABASE_PASSWORD": {
749749
"Fn::Join": [
750750
"",
@@ -793,7 +793,7 @@ exports[`Snapshot test 2`] = `
793793
"Endpoint.Port",
794794
],
795795
},
796-
"/main?connection_limit=1&connect_timeout=30",
796+
"/main?connection_limit=1&pool_timeout=30&connect_timeout=30",
797797
],
798798
],
799799
},
@@ -3295,7 +3295,7 @@ async function handler(event) {
32953295
],
32963296
},
32973297
"DATABASE_NAME": "main",
3298-
"DATABASE_OPTION": "?connection_limit=1&connect_timeout=30",
3298+
"DATABASE_OPTION": "?connection_limit=1&pool_timeout=30&connect_timeout=30",
32993299
"DATABASE_PASSWORD": {
33003300
"Fn::Join": [
33013301
"",
@@ -3344,7 +3344,7 @@ async function handler(event) {
33443344
"Endpoint.Port",
33453345
],
33463346
},
3347-
"/main?connection_limit=1&connect_timeout=30",
3347+
"/main?connection_limit=1&pool_timeout=30&connect_timeout=30",
33483348
],
33493349
],
33503350
},
@@ -3648,7 +3648,7 @@ async function handler(event) {
36483648
],
36493649
},
36503650
"DATABASE_NAME": "main",
3651-
"DATABASE_OPTION": "?connection_limit=1&connect_timeout=30",
3651+
"DATABASE_OPTION": "?connection_limit=1&pool_timeout=30&connect_timeout=30",
36523652
"DATABASE_PASSWORD": {
36533653
"Fn::Join": [
36543654
"",
@@ -3697,7 +3697,7 @@ async function handler(event) {
36973697
"Endpoint.Port",
36983698
],
36993699
},
3700-
"/main?connection_limit=1&connect_timeout=30",
3700+
"/main?connection_limit=1&pool_timeout=30&connect_timeout=30",
37013701
],
37023702
],
37033703
},

webapp/src/lib/prisma.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ function isRetryableError(error: unknown): boolean {
2525
msg.includes('idle-session timeout') ||
2626
msg.includes('terminating connection') ||
2727
msg.includes('Connection terminated') ||
28+
msg.includes('Timed out fetching a new connection from the connection pool') ||
2829
msg.includes('ECONNRESET')
2930
);
3031
}

0 commit comments

Comments
 (0)