A bounded thread pool via ExecutorService
ConsideredA thread per task, or parallel streams
WhyEnrichment is I/O-bound, so parallelism helps — but an unbounded thread count competes for the same database connections and makes things slower. A bounded pool sized against the connection pool keeps the two in proportion.