we encounter following behaviour while optimizing our ejb3 application:
- we have an Entity X with 2 collections of other entities
- loading of a big list of X (> 8000) takes ca. 3 s
- 2 subsequent loads of smaller lists of other entites in the same transaction take also 1-2 s
- the hibernate log shows dirty checking of collections of all X in the big list even if query hint readOnly is set, times are the same
- if not Entity X is loaded but only 2 fields thereof the subsequent loads take < 100ms
we changed this only for testing - we have to load the complete entity in the real system. are there any other ways or ideas how to avoid the time consuming dirty checking for read only methods? thanks in advance!
the profiling output:
with query hint readOnly:
09:53:43,536 INFO [STDOUT] getStreets: 3142 ms
09:53:45,365 INFO [STDOUT] getZipCodes: 1829 ms
09:53:48,930 INFO [STDOUT] getUIStateBar search version count 1: 1829 ms
09:53:49,117 INFO [STDOUT] getUIView: 8770 ms
without query hint readOnly:
09:58:14,540 INFO [STDOUT] getStreets: 2987 ms
09:58:16,416 INFO [STDOUT] getZipCodes: 1876 ms
09:58:19,528 INFO [STDOUT] getUIStateBar search version count 1: 1579 ms
09:58:19,716 INFO [STDOUT] getUIView: 8226 ms
using an extra object in query and not loading 8000 Entity X objects:
10:00:08,518 INFO [STDOUT] getStreets: 1189 ms
10:00:08,596 INFO [STDOUT] getZipCodes: 78 ms
10:00:08,658 INFO [STDOUT] getUIStateBar search version count 1: 31 ms
10:00:08,846 INFO [STDOUT] getUIView: 1564 ms