PreparedStatement batch und getGeneratedKeys

pups

Mitglied
Hallo,

ich habe 2 Tabellen. T2 hat einen FK auf T1. Nun füge ich mit preparedStatement und addBatch() einen haufen in T1. Jetzt rufe ich getGeneratedKeys() auf und kriege eine Liste von erzeugten Schlüsseln.

Nun nehme ich die in der Reihenfolge in der sie kommen und füge die Daten in T2 ein. Klappt alles wunderbar aber ich kann in der API nirgendswo den Satz finden, dass getGeneratedKeys die Schlüssel in der Reihenfolge zurückliefert wie sie in addBatch() gedacht gewesen wäre.

Also mit anderen Worten, ich will die zurückgelieferten Keys in der Software auf die eingefügten Daten mappen können, und der einzige Anhaltspunkt ist nunmal die Reihenfolge der Keys.

Darf ich das Annehmen oder ist das nur Zufall, dass das passt?

Danke vielmals
 

DerEisteeTrinker

Bekanntes Mitglied
Du kannst es annehmen, aber ob deine Annahme stimmt, siehst du erst, wenn das Licht angeht. Drauf verlassen würde ich mich nicht. Da ich nicht weiß, inwieweit du die Keys in der DB generierst, so würde ich vllt versuchen die Keys vorher in Java zu generieren und diese ebenfalls in einer LinkedList ablegen oder einer anderen reihenfolgen-bezogenen Collection und diese dann im Anschluß einfach in die T2 einzufügen.
 

pups

Mitglied
Danke für die Antwort.

Die Lösung mit Keys softwareintern vergeben fällt flach, da nicht ausgeschlossen werden kann, dass das Tool exclusiven Zugriff auf die DB hat.

Aber das Problem ist doch kein neues, besonders weltfremdes? Innerhalb einer Transaktion in mehrere Tabellen einfügen und dabei die referenzielle Integrität aufrecht erhalten, das sollte JDBC doch können. Ich will eben nur effizient mit dem Batchfeature arbeiten können.

Ich bin auch gern für andere Lösungen offen.

Trigger in einer DB sind Tabu (können sowieso nicht alle).

Also schieß(t) los. DANKE

p.s.

hier hab ich noch was gefunden:
java - Using getGeneratedKeys with batch inserts in MySQL with Connector/J - Stack Overflow
aber auch nur ein Testergebnis...
 
Zuletzt bearbeitet:

DerEisteeTrinker

Bekanntes Mitglied
Dann stellt sich mir die Frage, warum ist es wichtig, dass die Daten aus T2 genau in der gleichen Reihenfolge wie in T1 stehen? Einem SQL-Statement bzw. der referenziellen Integrität ist das herzlich egal. Wenn du auf T1 iwo einen Index hast, dann kannst du eh nicht beeinflussen in welcher Reihenfolge die Daten abgelegt werden, denn du weißt nicht, wie deine Datenbank intern die Daten strukturiert.
 

pups

Mitglied
Ich glaub da haben wir uns missverstanden... :)

Also mein Programm hat Datensätze die effizient in die DB müssen. Diese Daten werden auf mehrere Tabellen verteilt (T1,T2 usw.).

Der Datensatz als Ganzes ist der Eintrag in T1 und der Eintrag in T2 mit dem Fremdschlüssel aus T1.

Die Reihenfolge in der Tabellen ist absolut egal. Es geht mir um die Reihenfolge der erzeugten Schlüssel in T1 und ob diese mit der Reihenfolge übereinstimmt, wie ich PreparedStatement.addBatch() aufgerufen habe.

Diese Funktion brauche ich, um den T2-Daten den richtigen FK zu geben.

Weißt du/ihr was ich meine?
 

DerEisteeTrinker

Bekanntes Mitglied
Ich kann mir in etwa vorstellen was du meinst. Nur ist mir schleierhaft, wieso du auf die Reihenfolge bestehst. Du wirst doch sicher am Ende mit einem join oder einer Unterabfrage arbeiten oder etwa nicht?

Vllt kannst du mal eine mal einen beispielhaften Auszug der Tabellen vor und nach dem Einfügen geben, und genau aufzeigen, wo die Reihenfolge relevant ist.
 

pups

Mitglied
Nee ich will keine weiteren Abfragen danach mehr machen.

Also mal ein Beispiel, wobei's am Javacode ersichtlicher ist.

Java:
PreparedStatement st1 = cn.prepareStatement("INSERT INTO t1 (a,b) VALUES (?,?)",Statement.RETURN_GENERATED_KEYS);
	PreparedStatement st2 = cn.prepareStatement("INSERT INTO t2 (FK_von_t1,c) VALUES (?,?)");
	for (Data data:dataCollection){
		st1.setString(1,data.getA());
		st1.setString(2,data.getB());
		st1.addBatch();
	}
	int[] results = st1.executeBatch();
	ResultSet rs = st1.getGeneratedKeys();
	if (dataCollection.getSize()!=rs.getMetaData().getSize())throw IrgendEineException(); // dann cn.rollback() usw...
	Iterator<String[]> iter = dataCollection.iterator(); // rs und dataCollection sind gleich lang wenn results alle erfolgreich sind
	while(rs.next()) {
		String[] data = iter.next();
		String key = rs.getString(1);
		st2.setString(1,key);  //hier wird die Reihenfolge wichtig
		st2.setString(2,data.getC());
		st2.addBatch();
	}
	st22.executeBatch();
 

DerEisteeTrinker

Bekanntes Mitglied
*Klugscheißermodus ein*
in Zeile 10 Würde ich vor dem throw einen Zeilenumbruch machen
*Klugscheißermodus aus*

Zeile 13 und Zeile 16 funktionieren garantiert nicht. Ich nehme an, dass du Da aus dem String[] jedes Teil einzeln einfügst und mit dem FK versiehen möchtest.

Zur Topic:

also wenn der Quellcode in etwa den Sachverhalt wiederspiegelt und ich das richtig verstehe, dann würde ich sagen, dass du entweder den Entwicklern von Sun/Oracle vertraust und wartest, bis getGeneratedKeys mal falsch arbeitet oder du musst zwischendrin ein Select auf die eingefügten Daten machen, um die Keys zu erhalten und da kannst die Daten dann wieder zuordnen. Aber das musst du halt alles händisch machen.


Nee ich will keine weiteren Abfragen danach mehr machen.

Datenspeicherung ohne Sinn? Ist das nicht verfassungswidrig (sry, der Scherz musste sein)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T MySQL PreparedStatement mit INSERTs langsam, Batch-Statement auch Datenbankprogrammierung 4
Kirby.exe PreparedStatement wird nicht ausgeführt Datenbankprogrammierung 5
V SQLite NullPointerException in preparedStatement.close(); Datenbankprogrammierung 8
Neumi5694 SQL-Statement Preparedstatement - try resource vs. Garbage Collector Datenbankprogrammierung 5
S JDBC PreparedStatement durchiterieren Datenbankprogrammierung 6
S CSV Datein in DB übernehmen:PreparedStatement bzw executeBatch() zu langsam Datenbankprogrammierung 11
P MySQL PreparedStatement vs. StoredProcedure vs. executeBatch Datenbankprogrammierung 1
P PreparedStatement IN-Funktion Datenbankprogrammierung 8
R PreparedStatement ohne Parameter? Datenbankprogrammierung 4
turmaline Oracle [PreparedStatement] Klammer fehlt Datenbankprogrammierung 9
C PreparedStatement und null Datenbankprogrammierung 13
J Problem bei Boolean in PreparedStatement Datenbankprogrammierung 5
M Variable in SQL SELECT * FROM ... WHERE mithilfe von PreparedStatement benutzen? Datenbankprogrammierung 28
D MySQL PreparedStatement mit c3p0 schlägt fehl. Warum? Datenbankprogrammierung 3
S Oracle Problem mit PreparedStatement.setString(1,"str") Datenbankprogrammierung 10
M MySQL preparedStatement und Anführungszeichen Datenbankprogrammierung 6
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
G PreparedStatement und Transaktionen Datenbankprogrammierung 2
N Leeres Blob in ein PreparedStatement eintragen Datenbankprogrammierung 2
B H2 PreparedStatement SELECT * FROM ? Datenbankprogrammierung 4
M FindBugs und PreparedStatement aus einer Datei lesen Datenbankprogrammierung 11
Guybrush Threepwood PreparedStatement: execute() oder executeUpdate() Datenbankprogrammierung 3
R PreparedStatement mit verschiedenen Datenbanken Datenbankprogrammierung 2
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
R Zugriff auf SQL im PreparedStatement Datenbankprogrammierung 4
W preparedStatement (MySQL - JDBC) Datenbankprogrammierung 5
Landei PreparedStatement Parameter mehrfach verwenden Datenbankprogrammierung 18
S Create Table mit PreparedStatement Datenbankprogrammierung 2
S Select mit PreparedStatement Datenbankprogrammierung 2
S PreparedStatement setArray(int i, java.sql.Array) Datenbankprogrammierung 17
M Preparedstatement SQL-string auslesen Datenbankprogrammierung 13
T PreparedStatement anzeigen Datenbankprogrammierung 10
A PreparedStatement im Servlet - Referenz speichern Datenbankprogrammierung 3
P PreparedStatement - Angabe des PK Datenbankprogrammierung 4
J Fehler beim PreparedStatement Datenbankprogrammierung 2
B PreparedStatement - anzahl ParameterValues Datenbankprogrammierung 6
J PreparedStatement Datenbankprogrammierung 5
C PreparedStatement Datenbankprogrammierung 2
R DB2 PreparedStatement Batches ungültige Reihenfolge Datenbankprogrammierung 4
B DB Update via batch Datenbankprogrammierung 3
N batch-Update wird nicht durchgeführt Datenbankprogrammierung 2
L MySQL Prepared Statement batch langsamer als bulk insert? Datenbankprogrammierung 10
H Batch Update/Insert Datenbankprogrammierung 4
H Wie viele SQL-Statements gehen in ein Batch Datenbankprogrammierung 2
M mysql jdbc batch files ausführen. Datenbankprogrammierung 3
T [jdbc] einen Eintrag aus mehreren Tabellen löschen (Batch) Datenbankprogrammierung 3
S Statement.getGeneratedKeys() funktioniert nicht Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben