Commit 5f22456
authored
* fix: declare synchronized entity classes on native writes
Native queries that run executeUpdate() without declaring which tables
they touch make Hibernate conservatively evict EVERY L2 entity region,
not just the affected one.
NativeSQLQueryPlan.performExecuteUpdate calls coordinateSharedCacheCleanup
with getCustomQuery().getQuerySpaces(). SQLCustomQuery leaves that set
empty unless addSynchronizedEntityClass/QuerySpace was called, and
BulkOperationCleanupAction.affectedEntity treats an empty set as "affects
everything", so every persister that can write to cache gets an
EntityCleanup. EntityCleanup.release() calls unlockRegion(), which is
evictAll() -> evictData() on the whole region.
Note AbstractReadWriteAccess.removeAll IS a no-op under read-write, which
is why this is easy to miss; the eviction comes from unlockRegion, not
removeAll. Both stores here use stateless sessions, where
isEventSource() is false, so the cleanup runs immediately rather than
being deferred to the ActionQueue.
Draft to confirm the mechanism: measured on a Sierra Leone instance, a
single data value write with a new period emptied the whole DataElement
region (0 hits / 3037 logical misses on the next read), while the same
write with an existing period left it fully warm. No eviction or removal
counter moves and nothing is logged, so this is invisible without
instrumenting Hibernate.
HousekeepingJob runs every 20s by default and drives the jobconfiguration
writes here, so on a stock instance every cached entity region is dropped
on that cadence.
* fix: declare query spaces on the remaining native writes
* fix: synchronize entities not join tables so cached collections are evicted
* docs: explain query spaces in nativeSynchronizedQuery javadoc
* refactor: add stateless session variant of nativeSynchronizedQuery
* refactor: use nativeSynchronizedQuery in complete data set registration store
* refactor: run audit trigger DDL via jdbcTemplate
* fix: declare element entities for native writes to collection tables
A write to a collection table needs the collection's element entity
declared, not the owning entity. An entity's query spaces are its own
table(s) only (SingleTableEntityPersister), never the tables of the
collections it owns, and BulkOperationCleanupAction resolves collection
regions via getCollectionRolesByEntityParticipant, which is keyed by the
collection's element entity.
So synchronizing on the owner leaves its cached collection stale:
* categories_categoryoptions needs CategoryOption, not Category
* users_catdimensionconstraints needs Category, not User
Confirmed against a running instance. With a category collection warm and
in steady state (+1 hit, 0 misses per read), a merge of an unrelated pair
of categories left a bystander category's cached collection reloading cold
(+2 misses, +1 put), while an unrelated write left it fully warm.
Also correct the comments in the category combo and data set stores, which
reached the right regions but described the wrong reason, and expand the
nativeSynchronizedQuery javadoc with the element-entity rule.
1 parent 7b4cd04 commit 5f22456
15 files changed
Lines changed: 104 additions & 47 deletions
File tree
- dhis-2
- dhis-services/dhis-service-core/src/main/java/org/hisp/dhis
- analytics/hibernate
- category/hibernate
- dataapproval/hibernate
- dataset/hibernate
- datavalue/hibernate
- period/hibernate
- program/hibernate
- scheduling
- user/hibernate
- dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis
- dhis-tracker/src/main/java/org/hisp/dhis/tracker/imports/hibernate
Lines changed: 1 addition & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
79 | 79 | | |
80 | 80 | | |
81 | 81 | | |
82 | | - | |
83 | | - | |
| 82 | + | |
84 | 83 | | |
85 | 84 | | |
86 | 85 | | |
| |||
Lines changed: 6 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
| 40 | + | |
40 | 41 | | |
41 | 42 | | |
42 | 43 | | |
| |||
97 | 98 | | |
98 | 99 | | |
99 | 100 | | |
100 | | - | |
101 | | - | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
102 | 106 | | |
103 | 107 | | |
104 | 108 | | |
| |||
Lines changed: 6 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
| 42 | + | |
42 | 43 | | |
43 | 44 | | |
44 | 45 | | |
| |||
118 | 119 | | |
119 | 120 | | |
120 | 121 | | |
121 | | - | |
122 | | - | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
123 | 127 | | |
124 | 128 | | |
125 | 129 | | |
| |||
Lines changed: 1 addition & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
69 | | - | |
70 | | - | |
| 69 | + | |
71 | 70 | | |
72 | 71 | | |
73 | 72 | | |
| |||
Lines changed: 1 addition & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
135 | 135 | | |
136 | 136 | | |
137 | 137 | | |
138 | | - | |
139 | | - | |
| 138 | + | |
140 | 139 | | |
141 | 140 | | |
142 | 141 | | |
| |||
Lines changed: 5 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
171 | 171 | | |
172 | 172 | | |
173 | 173 | | |
174 | | - | |
175 | | - | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
176 | 179 | | |
177 | 180 | | |
178 | 181 | | |
| |||
Lines changed: 7 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
76 | | - | |
| 76 | + | |
77 | 77 | | |
78 | 78 | | |
79 | 79 | | |
| |||
83 | 83 | | |
84 | 84 | | |
85 | 85 | | |
86 | | - | |
| 86 | + | |
87 | 87 | | |
88 | 88 | | |
89 | 89 | | |
| |||
93 | 93 | | |
94 | 94 | | |
95 | 95 | | |
96 | | - | |
97 | | - | |
| 96 | + | |
98 | 97 | | |
99 | 98 | | |
100 | 99 | | |
| |||
258 | 257 | | |
259 | 258 | | |
260 | 259 | | |
261 | | - | |
| 260 | + | |
| 261 | + | |
262 | 262 | | |
263 | 263 | | |
264 | 264 | | |
265 | 265 | | |
266 | 266 | | |
267 | 267 | | |
268 | 268 | | |
269 | | - | |
| 269 | + | |
| 270 | + | |
270 | 271 | | |
271 | 272 | | |
Lines changed: 1 addition & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
87 | 87 | | |
88 | 88 | | |
89 | 89 | | |
90 | | - | |
91 | | - | |
| 90 | + | |
92 | 91 | | |
93 | 92 | | |
94 | 93 | | |
| |||
Lines changed: 9 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
124 | 124 | | |
125 | 125 | | |
126 | 126 | | |
127 | | - | |
128 | | - | |
| 127 | + | |
129 | 128 | | |
130 | 129 | | |
131 | 130 | | |
| |||
144 | 143 | | |
145 | 144 | | |
146 | 145 | | |
147 | | - | |
148 | | - | |
| 146 | + | |
149 | 147 | | |
150 | 148 | | |
151 | 149 | | |
| |||
261 | 259 | | |
262 | 260 | | |
263 | 261 | | |
264 | | - | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
265 | 268 | | |
266 | 269 | | |
267 | 270 | | |
| |||
286 | 289 | | |
287 | 290 | | |
288 | 291 | | |
| 292 | + | |
289 | 293 | | |
290 | 294 | | |
291 | 295 | | |
| |||
Lines changed: 1 addition & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
118 | 118 | | |
119 | 119 | | |
120 | 120 | | |
121 | | - | |
122 | | - | |
| 121 | + | |
123 | 122 | | |
124 | 123 | | |
125 | 124 | | |
| |||
0 commit comments