Start with a formula

pool_size = ((core_count * 2) + effective_spindle_count). For a 16-core app talking to SSD-backed Postgres: 34.

Advertisement

Total pool across instances

If you run 10 instances × 34 connections = 340 open connections. Postgres default max_connections is 100. Bump it or front with pgbouncer.

Advertisement

HikariCP config

HikariConfig cfg = new HikariConfig();
cfg.setMaximumPoolSize(34);
cfg.setMinimumIdle(4);
cfg.setConnectionTimeout(3000);      // 3s
cfg.setIdleTimeout(600000);          // 10min
cfg.setMaxLifetime(1800000);         // 30min
cfg.setLeakDetectionThreshold(60000); // 1min
DataSource ds = new HikariDataSource(cfg);