Hibernate Optimization in Spring Boot: Configuration and Caching

Hibernate Optimization in Spring Boot: Configuration and Caching

Development and maintenance of all types of websites:

Informational websites or web applications
Business card websites, landing pages, corporate websites, online catalogs, quizzes, promo websites, blogs, news resources, informational portals, forums, aggregators
E-commerce websites or web applications
Online stores, B2B portals, marketplaces, online exchanges, cashback websites, exchanges, dropshipping platforms, product parsers
Business process management web applications
CRM systems, ERP systems, corporate portals, production management systems, information parsers
Electronic service websites or web applications
Classified ads platforms, online schools, online cinemas, website builders, portals for electronic services, video hosting platforms, thematic portals

These are just some of the technical types of websites we work with, and each of them can have its own specific features and functionality, as well as be customized to meet the specific needs and goals of the client.

Our competencies:

Frequently Asked Questions

Latest works

  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1287
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1245
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    983
  • image_crm_chasseurs_493_0.webp
    CRM development for Chasseurs
    1034
  • image_website-sbh_0.webp
    Website development for SBH Partners
    1108
  • image_website-_0.webp
    Website development for Red Pear
    555

Hibernate Optimization in Spring Boot: Configuration and Caching

Your Spring Boot application slows down as user count grows? The culprit is often suboptimal ORM settings: N+1 queries, missing cache, wrong fetch strategies. We deal with such projects daily and know how to turn a sluggish ORM into a performant data access layer. Our experience shows that proper Hibernate tuning cuts API response time by 30–50% without changing business logic. Recently we optimized a project with 50+ entities: after configuring second-level cache and fixing N+1, query count dropped from 200 to 20 per page, and load time fell from 4 seconds to 0.5. Monthly cloud cost savings exceeded $500. The slowdown often stems from wrong fetch strategy—Lazy when it should be Eager or vice versa. Let's see how to avoid these pitfalls.

How to Properly Configure Hibernate in Spring Boot?

Basic configuration includes Maven dependencies, DataSource settings, and Hibernate parameters. Below is a typical setup for PostgreSQL with HikariCP pool.

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency> </dependencies> 
spring: datasource: url: jdbc:postgresql://localhost:5432/mydb username: ${DB_USER} password: ${DB_PASSWORD} driver-class-name: org.postgresql.Driver hikari: pool-name: HikariPool-main maximum-pool-size: 20 minimum-idle: 5 idle-timeout: 300000 connection-timeout: 20000 max-lifetime: 1200000 connection-test-query: SELECT 1 jpa: database-platform: org.hibernate.dialect.PostgreSQLDialect hibernate: ddl-auto: validate show-sql: false properties: hibernate: format_sql: true jdbc: batch_size: 50 order_inserts: true order_updates: true cache: use_second_level_cache: true use_query_cache: true region.factory_class: org.hibernate.cache.jcache.JCacheCacheRegionFactory generate_statistics: false 

Key Configuration Parameters

Parameter Value Explanation
spring.jpa.hibernate.ddl-auto validate Validates schema without changes. Safe for production
spring.jpa.properties.hibernate.jdbc.batch_size 50 Groups INSERT/UPDATE in batches of 50
spring.jpa.properties.hibernate.cache.use_second_level_cache true Enables second-level cache (requires implementation)
spring.datasource.hikari.maximum-pool-size 20 Number of connections in pool
spring.datasource.hikari.max-lifetime 1200000 20 minutes, less than PostgreSQL's wait_timeout

Resolving the N+1 Query Problem

Classic scenario: you load a list of products, then inside a loop call product.getCategory(). The framework executes one query for the list and N queries for each category. Result: hundreds of SQL calls.

// N+1 queries List<Product> products = productRepository.findAll(); for (Product p : products) { System.out.println(p.getCategory().getName()); } 

Use JOIN FETCH in JPQL if the association is always needed. For varying scenarios, EntityGraph is suitable. @BatchSize reduces query count for collections loaded on demand.

@Query("SELECT p FROM Product p JOIN FETCH p.category WHERE p.status = :status") List<Product> findWithCategory(@Param("status") ProductStatus status); @EntityGraph(attributePaths = {"category", "tags"}) List<Product> findByStatus(ProductStatus status); 

Comparison of Fetch Strategies

Strategy Query Count Flexibility Recommendation
JOIN FETCH 1 (single JOIN) Low For mandatory associations—10x more efficient than lazy loading
EntityGraph 1 (single query) Medium When graph varies
@BatchSize N / batchSize High For collections loaded on demand

Note: Using JOIN FETCH cuts queries by an order of magnitude compared to lazy loading for mandatory associations.

Why Is Second-Level Cache Important?

Second-level cache stores data across transactions, reducing database load. Enable it in configuration and plug in an implementation like Ehcache. Entities annotated with @Cacheable are automatically cached. This yields up to 3× performance boost for frequently accessed data—making cache 3 times faster than no cache. To enable it, add the cache properties shown above in application.yml. Then add Ehcache dependency and configure ehcache.xml with appropriate regions. The investment pays off within 2–3 months.

What’s Included in the Optimization Package

Our optimization package includes:

  • Analysis of current configuration and database schema
  • Design of optimal entity model (indexes, relationship types)
  • Second-level cache and query cache configuration
  • Migration setup via Flyway or Liquibase
  • Unit tests for the DAO layer (with H2 or Testcontainers)
  • Full configuration documentation
  • Team training session (2 hours)
  • 30 days of ongoing support

Deliverables include documentation, access credentials, training materials, and dedicated support. We guarantee that after tuning, the number of SQL queries to the database is at least halved. Our track record: The company has 10+ years of Java experience, has completed 150+ successful projects, and has been on the market for 5 years—delivering measurable results.

How We Work – Step by Step

  1. Analysis: parse current Hibernate logs (enable hibernate.generate_statistics), identify slow queries and missing indexes.
  2. Design: optimize mapping, add indexes, choose fetch and caching strategies.
  3. Implementation: write configuration, migrations, tests, configure connection pool.
  4. Testing: verify performance under load tests, compare before/after times.
  5. Deployment and Monitoring: set up metrics (Micrometer, Prometheus) for ongoing control.

According to official Spring Data JPA documentation, using @BatchSize is preferred for collections with unpredictable loading patterns.

Timelines

Initial setup of Spring Boot + Hibernate + Flyway for a new project: 1–2 days. Optimizing an existing project (fix N+1 problem, configure cache, refactor entities): 2–4 days depending on codebase size.

Want to eliminate N+1 in your project? Order a Hibernate audit—our engineers will find every bottleneck. The full package starts at $2,000 and can save you $500 per month on cloud costs. Get a free consultation on performance tuning.