From 2296ba0f470ebc6b93c0c09684337b1ed3226428 Mon Sep 17 00:00:00 2001 From: netroms Date: Mon, 24 Aug 2026 17:57:27 +0800 Subject: [PATCH 1/8] perf: fix the L2 cache region-lock convoy on concurrent metadata-heavy load (#24810) (cherry picked from commit 501d55901534d1262bd711a79ebff5f894007ae0) --- .../org/hisp/dhis/category/CategoryCombo.java | 4 +- .../hisp/dhis/category/CategoryOption.java | 10 +- .../hisp/dhis/indicator/IndicatorGroup.java | 6 +- .../dhis/indicator/IndicatorGroupSet.java | 4 +- .../java/org/hisp/dhis/legend/Legend.java | 2 +- .../java/org/hisp/dhis/legend/LegendSet.java | 2 +- .../java/org/hisp/dhis/option/OptionSet.java | 2 +- .../dhis/category/hibernate/Category.hbm.xml | 6 +- .../hibernate/CategoryDimension.hbm.xml | 4 +- .../hibernate/CategoryOptionCombo.hbm.xml | 4 +- .../hibernate/CategoryOptionGroup.hbm.xml | 6 +- .../hibernate/CategoryOptionGroupSet.hbm.xml | 4 +- .../CategoryOptionGroupSetDimension.hbm.xml | 4 +- .../hibernate/DataElementGroup.hbm.xml | 6 +- .../hibernate/DataElementGroupSet.hbm.xml | 4 +- .../DataElementGroupSetDimension.hbm.xml | 4 +- .../hibernate/DataElementOperand.hbm.xml | 2 +- .../indicator/hibernate/Indicator.hbm.xml | 8 +- .../indicator/hibernate/IndicatorType.hbm.xml | 2 +- .../hisp/dhis/option/hibernate/Option.hbm.xml | 2 +- .../dhis/option/hibernate/OptionGroup.hbm.xml | 4 +- .../option/hibernate/OptionGroupSet.hbm.xml | 4 +- .../hibernate/OrganisationUnit.hbm.xml | 14 +- .../hibernate/OrganisationUnitGroup.hbm.xml | 6 +- .../OrganisationUnitGroupSet.hbm.xml | 4 +- .../OrganisationUnitGroupSetDimension.hbm.xml | 4 +- .../hibernate/OrganisationUnitLevel.hbm.xml | 2 +- .../dhis/period/hibernate/PeriodType.hbm.xml | 2 +- .../src/main/resources/ehcache.xml | 152 +++++++++++++++-- .../cache/HibernateEhcacheConfigFileTest.java | 159 ++++++++++++++++++ ...etMetadataExportServiceQueryCountTest.java | 13 +- 31 files changed, 371 insertions(+), 79 deletions(-) create mode 100644 dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/cache/HibernateEhcacheConfigFileTest.java diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/category/CategoryCombo.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/category/CategoryCombo.java index 866137bf9979..8625aa8cc48d 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/category/CategoryCombo.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/category/CategoryCombo.java @@ -124,11 +124,11 @@ public class CategoryCombo extends BaseMetadataObject foreignKey = @ForeignKey(name = "fk_categorycombo_categoryid"))) @OrderColumn(name = "sort_order") @ListIndexBase(1) - @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) private List categories = new ArrayList<>(); @OneToMany(fetch = FetchType.LAZY, mappedBy = "categoryCombo") - @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) private Set optionCombos = new HashSet<>(); @Column(name = "datadimensiontype", nullable = false) diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/category/CategoryOption.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/category/CategoryOption.java index 5ff9befb442b..224afdd13f6f 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/category/CategoryOption.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/category/CategoryOption.java @@ -111,7 +111,7 @@ @Entity @Table(name = "categoryoption") @Setter -@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @JacksonXmlRootElement(localName = "categoryOption", namespace = DXF_2_0) public class CategoryOption extends BaseMetadataObject implements DimensionalItemObject, SystemDefaultMetadataObject, Serializable { @@ -158,21 +158,21 @@ public class CategoryOption extends BaseMetadataObject name = "categoryoption_organisationunits", joinColumns = @JoinColumn(name = "categoryoptionid"), inverseJoinColumns = @JoinColumn(name = "organisationunitid")) - @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @BatchSize(size = 100) private Set organisationUnits = new HashSet<>(); @ManyToMany(mappedBy = "categoryOptions") - @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @BatchSize(size = 100) private Set categories = new HashSet<>(); @ManyToMany(mappedBy = "categoryOptions") - @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) private Set categoryOptionCombos = new HashSet<>(); @ManyToMany(mappedBy = "members") - @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) private Set groups = new HashSet<>(); @Type(type = "jsbObjectSharing") diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorGroup.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorGroup.java index 55f8b0ccc916..0f78ce47b461 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorGroup.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorGroup.java @@ -93,7 +93,7 @@ @Setter @Entity @Table(name = "indicatorgroup") -@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class IndicatorGroup extends BaseMetadataObject implements IdentifiableObject, MetadataObject { @Id @@ -123,7 +123,7 @@ public class IndicatorGroup extends BaseMetadataObject @JoinColumn( name = "indicatorid", foreignKey = @ForeignKey(name = "fk_indicatorgroup_indicatorid"))) - @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) private Set members = new HashSet<>(); @Type(type = "jsbAttributeValues") @@ -135,7 +135,7 @@ public class IndicatorGroup extends BaseMetadataObject private Sharing sharing = new Sharing(); @ManyToMany(mappedBy = "members", fetch = FetchType.LAZY) - @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) private Set groupSets = new HashSet<>(); // ------------------------------------------------------------------------- diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorGroupSet.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorGroupSet.java index c2e784eeb570..29fb410a825f 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorGroupSet.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/indicator/IndicatorGroupSet.java @@ -93,7 +93,7 @@ @Setter @Entity @Table(name = "indicatorgroupset") -@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class IndicatorGroupSet extends BaseMetadataObject implements IdentifiableObject, MetadataObject { @@ -134,7 +134,7 @@ public class IndicatorGroupSet extends BaseMetadataObject foreignKey = @ForeignKey(name = "fk_indicatorgroupset_indicatorgroupid"))) @OrderColumn(name = "sort_order", nullable = false) @ListIndexBase(1) - @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) private List members = new ArrayList<>(); // ------------------------------------------------------------------------- diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/legend/Legend.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/legend/Legend.java index c4872212bf6e..d06a4a215d90 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/legend/Legend.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/legend/Legend.java @@ -90,7 +90,7 @@ @Index(name = "maplegend_endvalue", columnList = "endvalue") }) @JacksonXmlRootElement(localName = "legend", namespace = DxfNamespaces.DXF_2_0) -@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @Setter public class Legend implements IdentifiableObject, EmbeddedObject { diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/legend/LegendSet.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/legend/LegendSet.java index 7e5f105fc613..6a7b0918a0de 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/legend/LegendSet.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/legend/LegendSet.java @@ -104,7 +104,7 @@ public class LegendSet extends BaseMetadataObject implements IdentifiableObject, @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "maplegendsetid") - @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) private Set legends = new HashSet<>(); public LegendSet() {} diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/option/OptionSet.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/option/OptionSet.java index cf78c9c6369c..828d2909d789 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/option/OptionSet.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/option/OptionSet.java @@ -127,7 +127,7 @@ public class OptionSet extends BaseMetadataObject implements IdentifiableObject, @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "optionsetid", foreignKey = @ForeignKey(name = "fk_optionset_optionid")) @OrderBy(value = "sortOrder ASC") - @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) private List