// High-performance pattern try (PreparedStatement ps = connection.prepareStatement("INSERT INTO users (id, name) VALUES (?, ?)")) for (User user : userList) ps.setLong(1, user.id()); ps.setString(2, user.name()); ps.addBatch();
Surviving architecture requires optimizing the top 2-3 bottlenecks. Here are the high-impact fixes.
Note: The page/chapter numbering may differ between the first edition (2016) and the second edition (2021). high-performance java persistence pdf 20
Benchmark metric to watch: – Not average latency. The slow 0.1% of DB calls ruin user experience.
hikari: maximumPoolSize: (CPU cores * 2) + 1 # Old rule. For Virtual Threads, start lower. connectionTimeout: 30000 idleTimeout: 600000 dataSourceProperties: cachePrepStmts: true prepStmtCacheSize: 250 prepStmtCacheSqlLimit: 2048 useServerPrepStmts: true rewriteBatchedStatements: true # Crucial for batch performance Benchmark metric to watch: – Not average latency
A sample pom.xml snippet for Java 20:
Instead of sending SQL statements one by one, use JDBC batching to group multiple statements into a single database roundtrip, significantly reducing overhead. For Virtual Threads, start lower
Published in November 2020, this specific issue covers several critical optimizations for Java developers: PostgreSQL 13 Improvements
Don't just index; cover your queries. If you only need name and email , create an index on (id, name, email) so the database never touches the heap table.