Ich schreibe gerade an einem ähnlichen Programm und hatte die Laufzeit von ein paar Tagen auf 6h runter gebracht. Dabei hatte ich in der ersten Version folgende Fehler drin, heisst aber nicht, dass du die auch hast, nur als Anregung. Ich verwende Spring und Hibernate.
Ein Fehler war in der Transaktionslogik, dadurch wurden für jedes Statement eine eigene Session aufgemacht. Jetzt verwende ich eine Session für den gesamten Import mit mehreren Transaktionen. Die Session ist der First Level Cache, daher hatte ich defacto in der ersten Version keinen Cache.
Ich hatte einen Fehler im Mapping, wodurch zu viel gelesen wurde. Es reicht wahrscheinlich, wenn du für K1 alle zugehörigen K2 ermitteln kannst und must nicht die ungekehrte Richtung auch noch unterstützen.
Als ich die ganzen unnötigen Statements weg hatte und nur noch inserts hatte, habe ich dann Batch-Insert aktiviert.
Ein Vorteil bei meinen Dateien ist, dass die K2-Datei(en) nach K1 sortiert sind, d.h. obwohl ich nach 100 importierten Datensätzen die Session flush'e und clear'e, zerstört dies den Effekt des Caches nicht.
Die Statements siehst du, wenn du
- bei log4j die Zeile log4j.logger.org.hibernate.SQL=DEBUG einfügst oder
- in deiner Hibernate.cfg die property "show_sql" auf true setzt, dabei schadet "hibernate.format_sql" auch nicht.
Die Transaktionen und Sessions habe ich bei Spring mit
Code:
log4j.logger.org.springframework.orm.hibernate3.SessionFactoryUtils=DEBUG
log4j.logger.org.springframework.orm.hibernate3.HibernateTransactionManager=DEBUG
log4j.logger.org.springframework.transaction.support.AbstractPlatformTransactionManager=DEBUG
bekommen.
Hoffe, das hilft.
Gruss, Christian