High-Performance Java Persistence Newsletter, Issue 47
Imagine having a tool that can automatically detect JPA and Hibernate performance issues. Wouldn’t that be just awesome?
Well, Hypersistence Optimizer is that tool! And it works with Spring Boot, Spring Framework, Jakarta EE, Java EE, Quarkus, or Play Framework.
So, enjoy spending your time on the things you love rather than fixing performance issues in your production system on a Saturday night!
Introduction
Welcome to a new issue of the High-Performance Java Persistence Newsletter in which we share articles, videos, workshops, and StackOverflow answers that are very relevant to any developer who interacts with a database system using Java.
Articles
The pick of this edition is this article that not only explains how B+Tree indexes work in PostgreSQL, but it provides an OSS tool to help you visualize them.
Speaking of PostgreSQL, this article explained why it would be useful if PostgreSQL supported Transparent Database Encryption (TDE).
If you are using Spring or Spring Boot, then you are better off using the BaseJpaRepository
from the Hypersistence Utils project instead of the default Spring Data JpaRepository
. For more details about this topic, check out this article.
If you are using MySQL, then check out this article about the effect of network bandwidth on database performance. What’s nice about this article is that you can spot the Universal Scalability Law in the performance charts.
Related to MySQL, it’s worth reading this article about the overhead of COMMIT in RDS or Aurora MySQL versions.
Another good article I read was this one about LSM-Tree merging in YugabyteDB.
Related to YugabyteDB, I also wrote two articles about it:
Videos
I uploaded a new video on YouTube about the best way to detect performance issues in JPA and Hibernate applications:
This video is part of a series of videos about optimizing Java applications using the amazing Hypersistence Optimizer.
Best Tweets
Here are the best tweets I posted since the last newsletter:
Applying the StackOverflow solution to your project pic.twitter.com/Q5bgo1eMef
— Vlad Mihalcea (@vlad_mihalcea) January 15, 2023
Architecture Pitfalls: Don’t use your ORM entities for everything — embrace the SQL!https://t.co/JVEsWT5QM8 pic.twitter.com/KthFueCwXa
— Vlad Mihalcea (@vlad_mihalcea) January 13, 2023
The best way to use the Spring Transactional annotation
— Vlad Mihalcea (@vlad_mihalcea) January 1, 2023
https://t.co/G4AZecoMHL pic.twitter.com/4XJAsSfVkZ
How to encrypt and decrypt JSON properties with JPA
— Vlad Mihalcea (@vlad_mihalcea) January 26, 2023
https://t.co/JmdrdT3Jst pic.twitter.com/xK0T38ykvr
Spring Transaction Best Practices
— Vlad Mihalcea (@vlad_mihalcea) January 2, 2023
https://t.co/OkFRAIm2u7 pic.twitter.com/hN5IjRzU43
Project Releases
Hibernate ORM released the 6.2 CR2 version, which brings support for the MERGE
clause in HQL queries. Awesome news!
MySQL 8.0.32 has been released, providing a series of improvements and bug fixes. For instance, you can set a global explain_format
that applies to all EXPLAIN
statements. This is useful since I prefer the JSON
format as it provides more information than the default option does. For more details, check out the release notes.
And to match the server version, the MySQL Connector/J Driver released its 8.0.32 version, providing a series of bug fixes. For more details, check out the release notes.
The 11.2.3 and 11.2.2 versions of the Microsoft JDBC Driver were released, providing a series of bug fixes.
The Spring Data 2022.0.1 and 2021.2.7 has been released, providing bug fixes for both Spring Data JPA 3.0 and 2.7.

Get in touch with my latest articles!
StackOverflow Answers
The following StackOverflow answers have been trending since the last newsletter episode:
- How to lock a database row with JPA
- Where to find the DTD of Hibernate?
@Transactional(noRollbackFor=RuntimeException.class)
does not prevent rollback on RuntimeException- The same MySQL query shows up multiple times on Hibernate console, probably causing the slow response
- JPQL to select all objects, but with setMaxResult on object collections