Skip to content

Add noPreparedStatements option for connection pools#4

Open
Pom4H wants to merge 1 commit intomainfrom
claude/add-pglite-support-0hum0
Open

Add noPreparedStatements option for connection pools#4
Pom4H wants to merge 1 commit intomainfrom
claude/add-pglite-support-0hum0

Conversation

@Pom4H
Copy link
Copy Markdown
Owner

@Pom4H Pom4H commented Apr 30, 2026

Summary

Add support for disabling prepared statements in the embedded graphile-worker queue, which is required when using connection pools that cannot honour per-session prepared statements (such as PgBouncer in transaction pooling mode or PGlite-socket).

Key Changes

  • Added noPreparedStatements configuration option to PostgresWorldConfig with comprehensive documentation explaining when it's needed
  • Added WORKFLOW_POSTGRES_NO_PREPARED_STATEMENTS environment variable support (accepts 1 or true)
  • Updated createQueue() to forward the noPreparedStatements flag to graphile-worker's makeWorkerUtils() and run() calls
  • Updated createWorld() to resolve the configuration option from both explicit config and environment variables
  • Added comprehensive test coverage for both enabled and default (disabled) scenarios
  • Updated README with configuration examples and environment variable documentation

Implementation Details

  • The option defaults to undefined (prepared statements enabled) to maintain backward compatibility
  • When explicitly set or provided via environment variable, the flag is forwarded to graphile-worker's internal calls
  • The environment variable parser accepts both 1 and true (case-insensitive) as truthy values
  • Configuration is properly threaded through the queue initialization pipeline

…Glite

Forwards graphile-worker's noPreparedStatements flag through createWorld()
config and a WORKFLOW_POSTGRES_NO_PREPARED_STATEMENTS env var. Required when
the pool routes traffic through a layer that cannot honour per-session
prepared statements (PgBouncer txn mode, PGlite-socket).
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 30, 2026

📊 Benchmark Results

workflow with no steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 0.044s 1.005s 0.961s 10 1.00x
💻 Local Nitro 0.044s 1.005s 0.961s 10 1.00x
🐘 Postgres Express 0.046s 1.011s 0.964s 10 1.05x
🐘 Postgres Nitro 0.047s 1.009s 0.962s 10 1.07x
💻 Local Next.js (Turbopack) 0.048s 1.005s 0.957s 10 1.08x
🐘 Postgres Next.js (Turbopack) 0.059s 1.010s 0.951s 10 1.33x
workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.118s 2.010s 0.893s 10 1.00x
💻 Local Next.js (Turbopack) 1.119s 2.006s 0.887s 10 1.00x
🐘 Postgres Nitro 1.119s 2.009s 0.891s 10 1.00x
💻 Local Nitro 1.122s 2.007s 0.885s 10 1.00x
💻 Local Express 1.127s 2.005s 0.879s 10 1.01x
🐘 Postgres Next.js (Turbopack) 1.145s 2.010s 0.866s 10 1.02x
workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 10.660s 11.020s 0.360s 3 1.00x
🐘 Postgres Express 10.691s 11.020s 0.330s 3 1.00x
💻 Local Next.js (Turbopack) 10.809s 11.022s 0.213s 3 1.01x
🐘 Postgres Next.js (Turbopack) 10.841s 11.021s 0.180s 3 1.02x
💻 Local Nitro 10.916s 11.023s 0.108s 3 1.02x
💻 Local Express 10.940s 11.024s 0.084s 3 1.03x
workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 14.022s 14.221s 0.199s 5 1.00x
🐘 Postgres Express 14.024s 14.822s 0.798s 5 1.00x
🐘 Postgres Next.js (Turbopack) 14.515s 15.022s 0.507s 4 1.04x
💻 Local Next.js (Turbopack) 14.582s 15.029s 0.448s 4 1.04x
💻 Local Express 14.962s 15.030s 0.069s 4 1.07x
💻 Local Nitro 14.974s 15.029s 0.055s 4 1.07x
workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 12.896s 13.164s 0.268s 7 1.00x
🐘 Postgres Express 12.934s 13.022s 0.088s 7 1.00x
🐘 Postgres Next.js (Turbopack) 13.882s 14.309s 0.427s 7 1.08x
💻 Local Next.js (Turbopack) 15.889s 16.364s 0.475s 6 1.23x
💻 Local Express 16.391s 17.031s 0.641s 6 1.27x
💻 Local Nitro 16.688s 17.031s 0.343s 6 1.29x
Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.203s 2.008s 0.805s 15 1.00x
🐘 Postgres Express 1.203s 2.008s 0.805s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.221s 2.010s 0.789s 15 1.01x
💻 Local Express 1.488s 2.005s 0.517s 15 1.24x
💻 Local Next.js (Turbopack) 1.529s 2.006s 0.477s 15 1.27x
💻 Local Nitro 1.550s 2.006s 0.457s 15 1.29x
Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.293s 3.010s 0.717s 10 1.00x
🐘 Postgres Express 2.298s 3.008s 0.710s 10 1.00x
🐘 Postgres Next.js (Turbopack) 2.402s 3.009s 0.607s 10 1.05x
💻 Local Next.js (Turbopack) 2.707s 3.008s 0.301s 10 1.18x
💻 Local Express 2.816s 3.108s 0.293s 10 1.23x
💻 Local Nitro 2.881s 3.007s 0.127s 10 1.26x
Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 3.365s 4.009s 0.644s 8 1.00x
🐘 Postgres Express 3.409s 4.011s 0.602s 8 1.01x
🐘 Postgres Next.js (Turbopack) 3.629s 4.011s 0.383s 8 1.08x
💻 Local Next.js (Turbopack) 6.789s 7.216s 0.426s 5 2.02x
💻 Local Express 7.247s 8.020s 0.772s 4 2.15x
💻 Local Nitro 7.952s 8.519s 0.567s 4 2.36x
Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.202s 2.008s 0.806s 15 1.00x
🐘 Postgres Express 1.207s 2.008s 0.801s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.224s 2.010s 0.786s 15 1.02x
💻 Local Next.js (Turbopack) 1.480s 2.006s 0.526s 15 1.23x
💻 Local Express 1.533s 2.006s 0.473s 15 1.27x
💻 Local Nitro 1.540s 2.005s 0.465s 15 1.28x
Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.289s 3.010s 0.721s 10 1.00x
🐘 Postgres Express 2.335s 3.010s 0.675s 10 1.02x
🐘 Postgres Next.js (Turbopack) 2.407s 3.007s 0.600s 10 1.05x
💻 Local Express 2.850s 3.342s 0.491s 9 1.25x
💻 Local Next.js (Turbopack) 2.940s 3.208s 0.268s 10 1.28x
💻 Local Nitro 3.022s 3.564s 0.542s 9 1.32x
Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.391s 4.010s 0.619s 8 1.00x
🐘 Postgres Nitro 3.396s 4.011s 0.615s 8 1.00x
🐘 Postgres Next.js (Turbopack) 3.664s 4.013s 0.349s 8 1.08x
💻 Local Next.js (Turbopack) 7.295s 8.015s 0.720s 4 2.15x
💻 Local Express 8.057s 8.522s 0.466s 4 2.38x
💻 Local Nitro 8.646s 9.027s 0.380s 4 2.55x
workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.608s 1.006s 0.398s 60 1.00x
🐘 Postgres Express 0.615s 1.006s 0.391s 60 1.01x
🐘 Postgres Next.js (Turbopack) 0.778s 1.006s 0.228s 60 1.28x
💻 Local Next.js (Turbopack) 0.842s 1.004s 0.163s 60 1.38x
💻 Local Nitro 0.993s 1.137s 0.143s 53 1.63x
💻 Local Express 1.021s 1.974s 0.953s 31 1.68x
workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.453s 2.007s 0.554s 45 1.00x
🐘 Postgres Express 1.485s 2.007s 0.523s 45 1.02x
🐘 Postgres Next.js (Turbopack) 1.963s 2.283s 0.320s 40 1.35x
💻 Local Next.js (Turbopack) 2.640s 3.007s 0.368s 30 1.82x
💻 Local Express 3.030s 3.547s 0.517s 26 2.09x
💻 Local Nitro 3.033s 3.730s 0.697s 25 2.09x
workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.987s 3.342s 0.355s 36 1.00x
🐘 Postgres Express 3.058s 3.706s 0.648s 33 1.02x
🐘 Postgres Next.js (Turbopack) 3.906s 4.148s 0.242s 29 1.31x
💻 Local Next.js (Turbopack) 8.397s 9.016s 0.619s 14 2.81x
💻 Local Express 8.961s 9.401s 0.440s 13 3.00x
💻 Local Nitro 9.243s 9.941s 0.698s 13 3.09x
workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.224s 1.007s 0.783s 60 1.00x
🐘 Postgres Express 0.235s 1.006s 0.772s 60 1.05x
🐘 Postgres Next.js (Turbopack) 0.248s 1.007s 0.759s 60 1.11x
💻 Local Next.js (Turbopack) 0.542s 1.004s 0.462s 60 2.42x
💻 Local Express 0.560s 1.004s 0.444s 60 2.50x
💻 Local Nitro 0.625s 1.021s 0.396s 59 2.79x
workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.365s 1.006s 0.641s 90 1.00x
🐘 Postgres Express 0.368s 1.006s 0.637s 90 1.01x
🐘 Postgres Next.js (Turbopack) 0.482s 1.018s 0.536s 89 1.32x
💻 Local Express 2.355s 3.008s 0.654s 30 6.45x
💻 Local Next.js (Turbopack) 2.461s 2.976s 0.515s 31 6.74x
💻 Local Nitro 2.533s 3.008s 0.475s 30 6.94x
workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.575s 1.006s 0.431s 120 1.00x
🐘 Postgres Express 0.588s 1.006s 0.419s 120 1.02x
🐘 Postgres Next.js (Turbopack) 0.775s 1.033s 0.258s 117 1.35x
💻 Local Next.js (Turbopack) 9.934s 10.524s 0.590s 12 17.28x
💻 Local Express 10.192s 10.859s 0.668s 12 17.73x
💻 Local Nitro 10.888s 11.480s 0.593s 11 18.94x
Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.158s 1.001s 0.001s 1.011s 0.853s 10 1.00x
🐘 Postgres Express 0.175s 0.999s 0.001s 1.010s 0.836s 10 1.11x
💻 Local Next.js (Turbopack) 0.175s 1.003s 0.010s 1.016s 0.841s 10 1.11x
🐘 Postgres Next.js (Turbopack) 0.191s 1.001s 0.001s 1.009s 0.819s 10 1.21x
💻 Local Nitro 0.206s 1.004s 0.012s 1.018s 0.812s 10 1.31x
💻 Local Express 0.210s 1.004s 0.010s 1.016s 0.806s 10 1.33x
stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.504s 1.008s 0.003s 1.020s 0.516s 59 1.00x
🐘 Postgres Express 0.522s 1.006s 0.010s 1.027s 0.505s 59 1.03x
🐘 Postgres Next.js (Turbopack) 0.606s 1.010s 0.007s 1.026s 0.420s 59 1.20x
💻 Local Next.js (Turbopack) 0.661s 1.011s 0.010s 1.023s 0.362s 59 1.31x
💻 Local Nitro 0.745s 1.012s 0.009s 1.022s 0.277s 59 1.48x
💻 Local Express 0.855s 1.012s 0.009s 1.115s 0.260s 54 1.70x
10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.911s 1.110s 0.000s 1.126s 0.215s 54 1.00x
🐘 Postgres Express 0.915s 1.070s 0.000s 1.082s 0.167s 57 1.00x
🐘 Postgres Next.js (Turbopack) 0.918s 1.155s 0.000s 1.162s 0.244s 52 1.01x
💻 Local Express 1.193s 2.020s 0.000s 2.022s 0.828s 30 1.31x
💻 Local Nitro 1.236s 2.022s 0.001s 2.024s 0.788s 30 1.36x
💻 Local Next.js (Turbopack) 1.412s 2.019s 0.000s 2.201s 0.789s 28 1.55x
fan-out fan-in 10 streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.694s 2.144s 0.000s 2.152s 0.457s 28 1.00x
🐘 Postgres Nitro 1.734s 2.144s 0.000s 2.152s 0.418s 28 1.02x
🐘 Postgres Next.js (Turbopack) 1.835s 2.182s 0.000s 2.194s 0.359s 28 1.08x
💻 Local Express 3.250s 3.971s 0.001s 3.973s 0.724s 16 1.92x
💻 Local Next.js (Turbopack) 3.415s 4.098s 0.001s 4.102s 0.687s 15 2.02x
💻 Local Nitro 3.512s 4.102s 0.000s 4.105s 0.592s 15 2.07x

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Next.js (Turbopack) 15/21
🐘 Postgres Nitro 17/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 20/21
Next.js (Turbopack) 🐘 Postgres 17/21
Nitro 🐘 Postgres 20/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 30, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
✅ 💻 Local Development 1066 0 86 1152
✅ 📦 Local Production 1066 0 86 1152
✅ 🐘 Local Postgres 1066 0 86 1152
✅ 🪟 Windows 96 0 0 96
❌ 📋 Other 268 2 18 288
Total 3562 2 276 3840

❌ Failed Tests

📋 Other (2 failed)

e2e-local-postgres-nest-stable (2 failed):

  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow and step endpoints respond to health check messages

Details by Category

✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 90 0 6
✅ express-stable 90 0 6
✅ fastify-stable 90 0 6
✅ hono-stable 90 0 6
✅ nextjs-turbopack-canary 77 0 19
✅ nextjs-turbopack-stable 96 0 0
✅ nextjs-webpack-canary 77 0 19
✅ nextjs-webpack-stable 96 0 0
✅ nitro-stable 90 0 6
✅ nuxt-stable 90 0 6
✅ sveltekit-stable 90 0 6
✅ vite-stable 90 0 6
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 90 0 6
✅ express-stable 90 0 6
✅ fastify-stable 90 0 6
✅ hono-stable 90 0 6
✅ nextjs-turbopack-canary 77 0 19
✅ nextjs-turbopack-stable 96 0 0
✅ nextjs-webpack-canary 77 0 19
✅ nextjs-webpack-stable 96 0 0
✅ nitro-stable 90 0 6
✅ nuxt-stable 90 0 6
✅ sveltekit-stable 90 0 6
✅ vite-stable 90 0 6
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 90 0 6
✅ express-stable 90 0 6
✅ fastify-stable 90 0 6
✅ hono-stable 90 0 6
✅ nextjs-turbopack-canary 77 0 19
✅ nextjs-turbopack-stable 96 0 0
✅ nextjs-webpack-canary 77 0 19
✅ nextjs-webpack-stable 96 0 0
✅ nitro-stable 90 0 6
✅ nuxt-stable 90 0 6
✅ sveltekit-stable 90 0 6
✅ vite-stable 90 0 6
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 96 0 0
❌ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 90 0 6
❌ e2e-local-postgres-nest-stable 88 2 6
✅ e2e-local-prod-nest-stable 90 0 6

📋 View full workflow run


Some E2E test jobs failed:

  • Vercel Prod: failure
  • Local Dev: success
  • Local Prod: success
  • Local Postgres: failure
  • Windows: success

Check the workflow run for details.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants