fabien7474
fabien7474

Reputation: 16562

How to know/log whether Hibernate 2nd-level cache was used or not for a query?

Currently, in order to check if the Hibernate 2nd-level cache was used for a Database query, I check my SQL log (through p6spy or logSql=true in Datasource.groovy) to see if the Grais/Hibernate triggered an SQL query. And I assume that if the query was not logged, it might mean that cache was used.

It is pretty complicated for a simple information, isn't it?

So do you know a simple way to get and log the information : "Cache was used vs. DB query was triggered" ?

EDIT: Following Pascal recommendations, I have added this trace 'org.hibernate.cache' to my log4j configuration.

Upvotes: 14

Views: 14480

Answers (2)

Lachlan Roche
Lachlan Roche

Reputation: 25956

The short answer is that when query logging is enabled, each query is logged.

Various statistics are available via SessionFactory.getStatistics() and Session.getStatistics(). Query execution and query cache hit and miss counts are not available on the SessionStatistics.

In a test environment, where you do not have concurrent sessions, you could perform your cacheable query twice and assert that both of SessionStatistics.getQueryCacheHitCount() and SessionStatistics.getQueryExecutionCount() only increased by 1.

Upvotes: 7

Pascal Thivent
Pascal Thivent

Reputation: 570365

You could activate the org.hibernate.cache category to log all second-level cache activity. To do so (according to the Grails FAQ), edit your Config.groovy file. Find the line with:

hibernate = "off"

and replace it with:

hibernate.cache = "trace,stdout"

Upvotes: 8

Related Questions