Why We Ran the Numbers: Benchmarking JobRunr vs. Quartz on Postgres

We benchmarked JobRunr Pro against Quartz on Postgres. The results are in: JobRunr is 18 times faster, processing 500,000 jobs with a fraction of the database load.

  • Nicholas D’hondt
  • November 12, 2025

Why We Ran the Numbers: Benchmarking JobRunr vs. Quartz on Postgres

A potential customer recently asked us: “We run on Postgres. We know Quartz is the old standard, but how does JobRunr’s performance really stack up against it?”

It’s a question many Java developers have. You have a long-standing scheduler like Quartz that’s been part of the ecosystem for years. But you also feel the pain of bottlenecks. You suspect your scheduler might be heavy on the database, but it’s hard to prove without a direct comparison.

Many schedulers can struggle with modern Postgres stacks, leading to performance issues that are hard to diagnose.

So we decided to find out. We ran the numbers.

We set up a head-to-head benchmark. JobRunr Pro versus Quartz, both on the same Postgres database, to see how many jobs they could process.

The results were… even we were surprised.

Setting Up a Fair Test

To make this a real-world comparison, we needed to eliminate as many variables as possible.

Here was our setup.

  • Hardware: A dedicated Hetzner server (model EX44) so no other load would interfere.
  • Database: The same Postgres 18.0 database.
  • The Test: Enqueue 500,000 “hello-world” jobs and measure how long it takes to process them all. We wanted to test the schedulers, not the job logic.
  • Configuration: Both JobRunr and Quartz were set up with identical thread pool sizes and used the same database connection pool settings. We used the default settings for both projects otherwise.

We did try to use bulk scheduling in Quartz to make job creation faster. But we ran into exceptions and after losing time, we focused on the processing throughput. That’s the part that matters most for application stability.

A quick note on “hello-world” jobs: This test uses jobs that execute instantly. This is a best-case scenario designed to stress-test the scheduler’s overhead. In real-world applications, where your jobs might take 500ms or more, this 18x gap will naturally be smaller as the bottleneck shifts from the scheduler to your job’s execution time.

The Performance Results

We ran the test. And we checked the numbers.

For processing 500,000 jobs, the job throughput was:

  • Quartz: 145.48 jobs per second.
  • JobRunr Pro: 2732.24 jobs per second.

That’s not a small difference. JobRunr Pro was 18 times faster than Quartz on the exact same hardware and database.

Here is the raw data from our benchmark runs.

Date & TimeHost nameJava versionToolTool versionStorageProvideramount of created jobsamount of succeeded jobscreation durationprocessing durationjob throughput (jobs / sec)
2025-11-10T09:39:45.308751361ZUbuntu-2204-jammy-amd64-base25.0.1+8-LTSquartz2.5.1-SNAPSHOT (branch unknown)postgres:18.0500000500000PT57M53.5989764SPT57M17.435478266S145.48
2025-10-17T09:26:10.167417043ZUbuntu-2204-jammy-amd64-base25.0.1+8-LTSJobRunr Pro8.1.0 (master@d16a6f6e4)postgres:18.0500000500000PT27.787648139SPT3M3.102498029S2732.24

Why the 18x Difference? A Look at the Code

An 18x difference is massive. We had to know why.

We looked at the Quartz code and found a key design difference. Quartz uses row-level locking in a separate table called QRTZ_LOCKS.

SELECT * FROM QRTZ_LOCKS WHERE SCHED_NAME = ? AND LOCK_NAME = ? FOR UPDATE

This isn’t just our finding. In a techical article titled Performance Tuning on Quartz Scheduler, eBay’s engineering team documented this exact problem. They found that under heavy load, Quartz “runs into trouble” as database sessions stack up, all waiting on SELECT * FROM qrtz_LOCKS … FOR UPDATE.

Their article confirms that this lock competition is the main bottleneck. This means that for every job it processes, it’s making at least double the amount of database calls compared to JobRunr. It has to check and manage that separate lock table, which adds significant overhead and slows everything down.

JobRunr is built differently. It’s designed to be lightweight and use modern, efficient database patterns. For Postgres, this means using features like FOR UPDATE SKIP LOCKED.

This approach integrates the lock directly into the job fetch query. It allows JobRunr to grab and lock available jobs in a single, efficient database call. The database isn’t spending its time managing a separate lock table; it’s spending its time processing your jobs.

The 18x performance gain isn’t magic. It’s the result of a modern design choice that directly reduces your database load. While the gap will vary based on your job’s complexity, the underlying overhead in Quartz remains, creating unnecessary load on your database for every job.

Choosing the Right Tool (Not Just the Fastest)

Performance isn’t everything. This benchmark shows a specific scenario, and it’s important to be transparent about trade-offs.

When Quartz might still fit: Quartz is free and has been in production for decades. If you need highly complex, calendar-based scheduling (like custom holiday or fiscal calendars) or are maintaining a legacy enterprise system, it’s a mature choice.

When JobRunr fits: If your priority is high-throughput, high-reliability, and low database overhead for modern Java applications and microservices, this benchmark shows the clear architectural advantage.

This test compared the free and open-source Quartz with JobRunr Pro.

See the Proof for Yourself

We believe in transparency. You shouldn’t just take our word for it.

We published the full, reproducible benchmark on GitHub. You can run it yourself and see the numbers on your own stack.

Choosing a scheduler is a big decision. We hope this data helps you understand the real-world cost of database overhead.

If your application relies on high-throughput background jobs, ask yourself.

Could you benefit from a scheduler that’s 18 times faster and lighter on your database?

The JobRunr Blog

Everything you need to know about
background processing

Explore technical deep-dives, product updates, and real-world examples to help you build, scale, and monitor your Java background jobs.

blog image

April 9, 2024

JobRunr and JobRunr Pro v7.0.0!

We’re proud to announce the latest release, JobRunr & JobRunr Pro v7.0.0

Read More Details
blog image

October 31, 2024

Task schedulers in Java: modern alternatives to Quartz Scheduler

Quartz is often considered the standard job scheduling library in Java, which can lead developers to overlook more modern alternatives.

Read More Details
blog image

June 13, 2022

JobRunr at Spring.io!

Did you miss Spring.io? Watch the JobRunr talk I gave at Spring.io Barcelona!

Read More Details
call to action

Ready to build reliable background jobs?

You focus on your business logic. We’ll take care of scheduling your background jobs reliably.

Get Started with JobRunr