Statement.executeBatch() - oder wie geht das?

jeipack

Erfahrenes Mitglied
Hi
ich habe mir mit mysqldump einen MySQL-Dump erstellt, der die Struktur einer Datenbank enthält. Nun würde ich gerne dieses File via Java auf dem MySQL Server absetzen.

Um es einfacher zu machen arbeite ich im Moment mit einem einfachen CREATE TABLE der über mehrere Zeilen geht:
SQL:
CREATE TABLE `mytest` (
  `id` int(10) unsigned NOT NULL auto_increment,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Mit der Batchfunktion eines Statements funktionierts so nicht:
Java:
s.addBatch("CREATE TABLE  `mytest` (");
s.addBatch("  `id` int(10) unsigned NOT NULL auto_increment,");
s.addBatch("  PRIMARY KEY  (`id`)");
s.addBatch(") ENGINE=MyISAM DEFAULT CHARSET=latin1;");
s.executeBatch();
Er bringt mir:
Code:
java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ENGINE=MyISAM DEFAULT CHARSET=latin1' at line 1
	at com.mysql.jdbc.Statement.executeBatch(Statement.java:919)
	at ch.sbu.dataver.abwasser.dvimport.DatenmodelLib.batchTest(DatenmodelLib.java:148)
	at ch.sbu.dataver.abwasser.dvimport.TestingMain.testCreate(TestingMain.java:38)
	at ch.sbu.dataver.abwasser.dvimport.TestingMain.testRohrprofil(TestingMain.java:29)
	at ch.sbu.dataver.abwasser.dvimport.TestingMain.<init>(TestingMain.java:24)
	at ch.sbu.dataver.abwasser.dvimport.TestingMain.main(TestingMain.java:111)

Das Problem ist nun, dass das Strukturfile riesig ist und auch ab und zu den DELIMITER wechselt. Somit ist es nicht gerade einfach schnell alle Umbrüche zu löschen und nur dort wo ein ";" ist ein Umbruch einzusetzen. Ich müsste es also würklich als SQLScript absetzen können. (ala mysql < strukturfile.sql)

Wie kann ich sowas machen?

Sollte es gar nicht möglich sein müsste ich auf:
Java:
Runtime.getRuntime().exec("mysql < strukturfile.sql");
zurückgreifen. Was ich aber nur ungern machen würde.

Hoffentlich gibt es hier eine schönere Lösung.

Greez & Danke im Voraus
jeipack
 
Zuletzt bearbeitet von einem Moderator:
Ja, das vermute ich eben auch (Wobei es komisch ist, dass er erst bei der letzen Zeile eine Exception wirft).

Auf jedenfall würde das bedeuten, dass ich einen Parser für die Strukturfiles schreiben müsste.. oder eben exec("mysql < script.sql");


Eine andere Möglichkeit kennst du/ihr nicht?

Grüsse
 
Ein Batch dient bei JDBC dazu mehrere einzelne SQL Statements strukturiert zusammen abzufeuern, um so eine starke Performance Steigerung bei vielen Befehlen zu gewinnen.(Select afaik ausgeschlossen)

Für mich sieht das wie ein normales SQL Statement aus.

Hast du schon versucht einfach es als einzelnes SQL Statement auszuführen? (also mit execute)
 
Hey
Ja.. klar eine einzlene Createanweisung funktioniert schon mit execute. Aber es geht ja um einen dump, der hat hunderte von Creates drin.
Das funktioniert dann nicht mehr:
Java:
.execute("CREATE TABLE `mytest` (" +
"`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT," +
"PRIMARY KEY  (`id`)" +
") ENGINE=MyISAM DEFAULT CHARSET=latin1;"+
"CREATE TABLE `mytest2` ("+
"`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,"+
"PRIMARY KEY  (`id`)"+
") ENGINE=MyISAM DEFAULT CHARSET=latin1;");

Da ich langsam an die Stelle komme wo ich diese Methode schreiben muss werd ich es (vorerst) mit Runtime.getRuntime().exec() machen..

Danke trozdem
jeipack
 
Zurück