sql >> Databáze >  >> RDS >> Oracle

Po ruční aktualizaci DB vymažte mezipaměť Hibernate 2. úrovně

Podle Hibernate JavaDoc můžete použít org.hibernate.Cache.evictAllRegions() :

evictAllRegions() Odstraní všechna data z mezipaměti.

Pomocí Session a SessionFactory:

Session session = sessionFactory.getCurrentSession();

if (session != null) {
    session.clear(); // internal cache clear
}

Cache cache = sessionFactory.getCache();

if (cache != null) {
    cache.evictAllRegions(); // Evict data from all query regions.
}

1) Pokud potřebujete aktualizovat pouze jednu entitu (pokud přímo z db budete aktualizovat pouze určité entity), ne celou relaci, můžete použít

evictEntityRegion(Class entityClass) Vyžene všechna data entity z daného regionu (tj.

2) Pokud máte mnoho entit, které lze aktualizovat přímo z db, můžete použít tuto metodu, která vyřadí všechny entity z mezipaměti 2. úrovně (tuto metodu můžeme vystavit správcům prostřednictvím JMX nebo jiných nástrojů pro správu):

/**
 * Evicts all second level cache hibernate entites. This is generally only
 * needed when an external application modifies the game databaase.
 */
public void evict2ndLevelCache() {
    try {
        Map<String, ClassMetadata> classesMetadata = sessionFactory.getAllClassMetadata();
        Cache cache = sessionFactory.getCache();
        for (String entityName : classesMetadata.keySet()) {
            logger.info("Evicting Entity from 2nd level cache: " + entityName);
            cache.evictEntityRegion(entityName);
        }
    } catch (Exception e) {
        logger.logp(Level.SEVERE, "SessionController", "evict2ndLevelCache", "Error evicting 2nd level hibernate cache entities: ", e);
    }
}

3) Další přístup je popsán zde pro postgresql+hibernate, myslím, že můžete udělat něco podobného pro Oracle takto



  1. Upgradovat řádky pouze při upgradu aplikace

  2. Efektivně převádějte řádky na sloupce na serveru SQL

  3. Vypočítejte percentil z frekvence v MySQL

  4. Vytvořte a nakonfigurujte Oracle Linked Server v SQL Server