H2 100000 Entries in Datenbank einfügen

lam_tr

Top Contributor
Hallo zusammen,

ich habe eine XML-Datei die ich als Objekte in Java einlese und per Spring und Hibernate auf eine H2 Datenbank einfügen möchte.

Ich habe es schon angefangen, aber dieser Prozess läuft schon seit 3 Stunden. Besteht da die Moglichkeit diese Persistierung zu beschleunigen?

Viele Grüße
lam
 
Ist zwar schon eine Woche alt, insofern besteht die sehr wahrscheinliche Möglichkeit, das der Fehler schon gefunden ist, aber trotzdem noch ein wenig Meinung von mir...:

Da fehlt - vermute ich - ein Commit...? 100.000 Datensätze einfügen ohne zwischenzeitlichen Commit, kann schon - abhängig von anderen Faktoren - recht lange dauern...
 
Es sei denn, es wurde mit JPA realisiert. Da kümmert sich ja das Framework um das Commit. 🙂

Hi Steven, belehre mich bitte ruhig eines besseren, das wäre dann abhängig vom "transaction-type", oder?
Mein Projekt mit JPA war mit transaction-type resource-local und da haben wir (immer? da bin ich mir nicht mehr sicher) mit em.getTransaction().begin() etc. die Transaktions-Schleife selber gesetzt...
🙂

... aber auch bei einem Application-Server kann man doch die Transaktion beeinflussen...
 
Zuletzt bearbeitet:
Hey Susanne,

wenn du mit einem JPA Framework arbeitest wie zB. mit Eclipse Link oder einfach nur plain Hibernate und deine Umgebung ein Glasfish, WebLogic, JBoss oder Spring Container ist, sind diese Operationen innherhalb einer EJB oder CDI (ab JavaEE7) transactional.
Du persistierst deine Entitäten direkt über den EntityManager und da brauchst du dich generell nicht darum kümmern, ob der Commit richtig abgeschlossen wird oder das Rollback funktioniert.
Dazu wurder nämlich der TransactionManager erfunden (JTA) der sich um alles kümmert.
Ich würde generell nichts mehr manuell commiten. Das hat man früher gemacht. 🙂 Bin froh, dass es Spring und Co. gibt. Da hat man den Kopf frei für andere Sachen. ^^
Eine Springumgebung ist zB. in fünf Minuten aufgesetzt.

Aber jeder so wie er mag... Ist halt meine Arbeitsweise. 🙂

... aber auch bei einem Application-Server kann man doch die Transaktion beeinflussen...

Beeinflussen kann man natürlich alles aber man kann sich das Leben auch schwer machen. 🙂
 
Aber wenn man es ja dann weiss, muss man es ja nicht mehr machen. 🙂 Angefangen haben wir ja alle, indem wir alles manuell abwickeln, um das System dahinter zu vestehen. ^^
Aber dafür hat man ja die Zeit nicht mehr, um das alles immer und immer wieder zu tun. 🙂

Es ist generell richtig, sowas mal manuell entwickelt zu haben. Gar keine Frage! :-D
 
Hi Steven, hi Joose,

vielen Dank für Eure Ausführungen! 🙂

Für die meisten Anwendungsfälle ist das natürlich super, das man sich um die Transaktionen keine Gedanken machen muß. Aber für z.B. solche Massen-Inserts (100.000 Datensätze) sollte man darauf schon ein Auge haben. Bei Grails z.B. (welches ja auch auf Spring aufsetzt) kann ich dann einzelne Services und/oder Methoden in einer eigenen Transaktion laufen lassen.

Von Vorteil ist es, wenn einem die Arbeitsweise von transaction-type=JTA bewußt ist bzw. die Möglichkeiten diese zu beeinflussen.

Inserts von 100.000 Datensätzen in einer einzigen Transaktion, wenn das denn im genannten Beispiel der Fall sein sollte - wahrscheinlich abhängig von der Tabellenstruktur, der eingesetzten Datenbank und der DB-Server Hardware - ist doch schon ein nahezu unmögliches Unterfangen.
Als Beispiel hatten wir in einem Projekte schon Probleme wo versucht wurde ein paar tausend Datensätze in einer einzigen Tansaktion zu inserten. Nachdem dann alle x Datensätze ein commit eingesetzt wurde, lief der Job problemlos durch.

Wenn ich aber die Frage falsch deute etc. dann ignoriert meinen Einwand bitte. 🙂
 
Ja klar, man kann die Transaktionen auf Methoden (@Transactional) verteilen, das ist richtig.
In diesem Fall macht es bei einer H2 Datenbank evtl. Sinn solch einer Methode nach und nach so an die 1000 Zeilen evtl. als Parameter zu übergeben. Nach Abschluss der Methode wird automatisch die Transaction beendet sowie commited.
...aber wenn es nur ein paar Strings pro Zeile sind, müsste es bei 100.000 Zeilen kein Problem geben.

Bei der H2 ist es glaube ich auch so, dass erstmal alles im Speicher gehalten und erst bei einem Shutdown dieser in eine Datei geschrieben wird. Ist ja eine Filebasierte DB, oder?
Evtl. gibt es Probleme mit dem Speicher deines Rechners? Evtl. fängt dein System an auszulagern?

Man weiss es nicht. 🙂
 
🙂

Stimmt, man weiß es nicht! Und die Frage ist eh schon 2 Wochen alt und keine weitere Info dazu.

Aber trotzdem fand ich die Info/Antworten dazu interessant! 🙂 Vielen Dank!
 

Neue Themen


Zurück
Oben