Isso realmente depende do modelo de consulta do seu aplicativo e das demandas de tráfego.
- Usar Redis/Hazelcast pode gerar o melhor desempenho, pois não haverá mais ida e volta para o banco de dados, mas você acaba tendo dados normalizados no banco de dados e uma cópia desnormalizada no cache, o que pressionará a atualização do cache políticas. Assim, você obtém o melhor desempenho ao custo de implementar a atualização do cache sempre que os dados persistentes forem alterados.
- Usar o cache de 2º nível é mais fácil de configurar, mas armazena apenas entidades por id. Há também um cache de consulta, armazenando ids retornados por uma determinada consulta. Portanto, o cache de 2º nível é um processo de duas etapas que você precisa ajustar para obter o melhor desempenho. Quando você executa consultas de projeção, o cache de objeto de 2º nível não o ajudará, pois ele opera apenas no carregamento da entidade. A principal vantagem do cache de 2º nível é que é mais fácil mantê-lo sincronizado sempre que os dados são alterados, especialmente se todos os seus dados forem mantidos em hibernação.
Portanto, se você precisar de desempenho máximo e não se importar em implementar sua lógica de atualização de cache que garanta uma janela mínima de consistência eventual, use um cache externo.
Se você só precisa armazenar em cache entidades (que geralmente não mudam com tanta frequência) e acessa-as principalmente por meio do carregamento de entidade do Hibernate, o cache de 2º nível pode ajudá-lo.