2012-04-13 18 views
2

Abnahme Gegeben: Methode in einem @Stateless EJB, JTA Mysql Datenquelle und eine Liste von etwa 5000 Einheiten, die ich in einem Zyklus zu anhalten bin versucht:Persist allmählich Leistung

List<MyObj> objList = entityManager.createNamedQuery("Q1", MyObj.class).getResultList(); 
for(MyObj obj : objList) { 
    long start_time = Calendar.getInstance().getTimeInMillis(); 
    entityManager.persist(obj); 
    long end_time = Calendar.getInstance().getTimeInMillis(); 
    logger.info("Object saved in " + (end_time - start_time) + "ms"); 
} 
entityManager.close(); 

Log allmählich nachlassende Leistung zeigt von 15ms bis zu 180ms Zeit pro Entität sparen. Ich glaube, MySQL-Server-Einstellungen sind weit über die Bedürfnisse dieser Aufgabe - es zeigt unbedeutende Zunahme der CPU-und E/A-Operationen. Flushing EntityManager nach jeder Aktualisierung hat keine Auswirkungen.

Was könnte der Grund für eine solche Leistungsminderung sein? Bitte zeigen Sie mir in die richtige Richtung.

Antwort

3

Es sieht so aus, als ob die Verlangsamung durch eine große Anzahl von Entitäten im Persistenzkontext (d. H. Im Sitzungscache) verursacht wird. flush hilft hier nicht, weil es keine Entitäten aus Persistenzkontext entfernt.

Wenn Sie eine große Anzahl von Entitäten mit einem einzigen Persistenzkontext verarbeiten müssen, empfiehlt es sich, den Kontext regelmäßig mit clear() zu löschen.

Verwandte Themen