Skip to content

Commit 908ab82

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 c4b9d35 commit 908ab82

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
},
@@ -3406,7 +3406,7 @@ service iptables save",
34063406
],
34073407
},
34083408
"DATABASE_NAME": "main",
3409-
"DATABASE_OPTION": "?connection_limit=1&connect_timeout=30",
3409+
"DATABASE_OPTION": "?connection_limit=1&pool_timeout=30&connect_timeout=30",
34103410
"DATABASE_PASSWORD": {
34113411
"Fn::Join": [
34123412
"",
@@ -3455,7 +3455,7 @@ service iptables save",
34553455
"Endpoint.Port",
34563456
],
34573457
},
3458-
"/main?connection_limit=1&connect_timeout=30",
3458+
"/main?connection_limit=1&pool_timeout=30&connect_timeout=30",
34593459
],
34603460
],
34613461
},
@@ -3783,7 +3783,7 @@ service iptables save",
37833783
],
37843784
},
37853785
"DATABASE_NAME": "main",
3786-
"DATABASE_OPTION": "?connection_limit=1&connect_timeout=30",
3786+
"DATABASE_OPTION": "?connection_limit=1&pool_timeout=30&connect_timeout=30",
37873787
"DATABASE_PASSWORD": {
37883788
"Fn::Join": [
37893789
"",
@@ -3832,7 +3832,7 @@ service iptables save",
38323832
"Endpoint.Port",
38333833
],
38343834
},
3835-
"/main?connection_limit=1&connect_timeout=30",
3835+
"/main?connection_limit=1&pool_timeout=30&connect_timeout=30",
38363836
],
38373837
],
38383838
},

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
},
@@ -3236,7 +3236,7 @@ service iptables save",
32363236
],
32373237
},
32383238
"DATABASE_NAME": "main",
3239-
"DATABASE_OPTION": "?connection_limit=1&connect_timeout=30",
3239+
"DATABASE_OPTION": "?connection_limit=1&pool_timeout=30&connect_timeout=30",
32403240
"DATABASE_PASSWORD": {
32413241
"Fn::Join": [
32423242
"",
@@ -3285,7 +3285,7 @@ service iptables save",
32853285
"Endpoint.Port",
32863286
],
32873287
},
3288-
"/main?connection_limit=1&connect_timeout=30",
3288+
"/main?connection_limit=1&pool_timeout=30&connect_timeout=30",
32893289
],
32903290
],
32913291
},
@@ -3589,7 +3589,7 @@ service iptables save",
35893589
],
35903590
},
35913591
"DATABASE_NAME": "main",
3592-
"DATABASE_OPTION": "?connection_limit=1&connect_timeout=30",
3592+
"DATABASE_OPTION": "?connection_limit=1&pool_timeout=30&connect_timeout=30",
35933593
"DATABASE_PASSWORD": {
35943594
"Fn::Join": [
35953595
"",
@@ -3638,7 +3638,7 @@ service iptables save",
36383638
"Endpoint.Port",
36393639
],
36403640
},
3641-
"/main?connection_limit=1&connect_timeout=30",
3641+
"/main?connection_limit=1&pool_timeout=30&connect_timeout=30",
36423642
],
36433643
],
36443644
},

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)