MySQL PreparedStatement mit INSERTs langsam, Batch-Statement auch

ThePianoman

Mitglied
Hallo,

ich wollte ein PreparedStatement nutzen, um mehr Geschwindigkeit
bei meinen INSERTs zu haben. Also:
Java:
String sqlInsertWord = "INSERT INTO wordsp (germanWord, foreignWord, lessonId) VALUES (?,?,?)";
PreparedStatement prepStmt = conn.prepareStatement(sqlInsertWord); // dauert 0.5s !!!
Das Anmelden des PreparedStatement per conn.prepareStatement
dauert eine halbe Sekunde! Das kann doch nicht so lange dauern?!

Bei 400 INSERTs dauert connection.prepareStatement(...) 0,5s,
das Einfügen der Werte in einer Schleife selbst dann nochmal etwa 0,25s.

Das Gleiche mit ganz normalen einzelnen Statements dauert - aufgepasst -
0,75s, also genauso lang. Meine PreparedStatements wären also nur dann
schneller, wenn ich hier >400 Zeilen einfüge.

Ich habe gerade einen Statement-Batch getestet, also
Java:
String sqlInsert = "INSERT INTO wordsp (germanWord, foreignWord, lessonId) VALUES ('%s','%s',%s)";
while ((line = bis.readLine()) != null) { // 400 Zeilen im BufferedInputStream
  String sql = String.format(sqlInsert, values[0], values[1], lessonId);
  stmt.addBatch(sql);
}
stmt.executeBatch();.

Das dauert jetzt 0,8s; also länger als die einzelnen Statements
bzw. PreparedStatement. Ich bin verwirrt.

Sind 0,5s für das Parsen des PreparedStatement normal?
Warum ist ein Statement.executeBatch nicht schneller als
das Verschicken von einzelnen Statements?
Wo kann ich noch optimieren?

Danke und Gruß
Bernd

PS: Ich nutze MySQL 5.1, den MySQL-Connector v5.1.6, Java 6 Update 22,
all das in einer Web-Anwendung unter Tomcat6.
 

planetenkiller

Aktives Mitglied
Füge bei der JDBC Verbindungs-Url folgendes hinzu: ?rewriteBatchedStatements=true
Neuer Import Code:
Java:
String sqlInsertWord = "INSERT INTO wordsp (germanWord, foreignWord, lessonId) VALUES (?,?,?)";
PreparedStatement stmt = conn.prepareStatement(sqlInsertWord);
while ((line = bis.readLine()) != null) { // 400 Zeilen im BufferedInputStream
  stmt.setString(1, values[0]);
  stmt.setString(2, values[1]);
  stmt.setInt(3, lessonId);
  stmt.addBatch();
}
stmt.executeBatch();

Sollte folgenden Query an die DB schicken:
INSERT INTO wordsp (germanWord, foreignWord, lessonId) VALUES ('a','b',1),('a','b',1),('a','b',1),....

Effizienter geht es kaum noch.
 

ThePianoman

Mitglied
Füge bei der JDBC Verbindungs-Url folgendes hinzu: ?rewriteBatchedStatements=true
Effizienter geht es kaum noch.
Tatsächlich, mit dem Parameter "rewriteBatchedStatements" ist es etwas
schneller. In meinem Fall waren es statt vorher 0,75s jetzt 0,6s für meine
400 INSERTs. Die PreparedStatements im Batch habe iche dann auch
übernommen. Danke.

Edit: Ich habe gerade nochmal meinen Importer mit den INSERTs
aufgerufen und bin jetzt bei ca. 0,12s, also VIEL besser. Das war wohl
ein Problem mit Cache oder unvollständiger Kompilierung.
[Ende Edit]

Du rufst das conn.prepareStatement() aber nicht für jeden INSERT neu auf, oder?
Nein.

Edit:
Nächste Absätze sind dann weniger relevant, da die INSERTs jetzt
ausreichend schnell sind. Danke nochmal.[Ende Edit]

Als Nicht-DB-Experte finde ich diese Zahl von INSERTs (sagen wir mal
700 INSERTs pro Sekunde) extrem wenig. Das Ganze läuft auf einem
recht aktuellen und sauberen MySQL 5.1.41, Typ der DB ist MyISAM,
Datenträger ist eine SSD, BS ist Win7.

Sind das normale Werte (~700 INSERTs pro Sekunde)?
Ich gehe mal davon aus, dass in meiner Konfiguration wohl noch etwas
zu optimieren ist (xampp). Ein Aktualisierung auf MySQL 5.5 wird wohl
nicht substanziell etwas bringen, oder?

Meine Tabelle sieht so aus:
SQL:
CREATE TABLE `wordsp` (  `id` INT(11) NOT NULL AUTO_INCREMENT,  
`germanWord` VARCHAR(200) NULL DEFAULT NULL COLLATE 'utf8_general_ci',  
`gwAudio` BLOB NULL,  
`gwAudioLink` VARCHAR(80) NULL DEFAULT NULL COLLATE 'utf8_general_ci',  
`foreignWord` VARCHAR(200) NULL DEFAULT NULL COLLATE 'utf8_general_ci',  
`fwAudio` BLOB NULL,  
`fwAudioLink` VARCHAR(80) NULL DEFAULT NULL COLLATE 'utf8_general_ci',  
`lessonId` INT(11) NOT NULL,  `score` INT(1) NULL DEFAULT '3' 
`comment` VARCHAR(250) NULL DEFAULT NULL COLLATE 'utf8_general_ci',  
UNIQUE INDEX `id` (`id`) )  
COLLATE 'latin1_swedish_ci' 
ENGINE=MyISAM ROW_FORMAT=Dynamic AUTO_INCREMENT=1986 COMMENT='';

Gruß
Bernd
 
Zuletzt bearbeitet:

student86

Mitglied
Moin Moin,
ich benutze die selbe methode um Daten aus einer Datei in eine DB zu bekommen.
Doch bei schafft er ca 10 einträge in der Sekunde..... das ist viel zu langsam.
kann aber keinen unterschied zum hier verwendetet code finden ???

Java:
       String line;	
	        String[]values;
	        PreparedStatement ps = connection.prepareStatement("INSERT INTO Symboltabelle VALUES (?, ?, ?,?);");
	        while ((line=br.readLine())!=null){
	        	values=line.split(";");
	            ps.setString(1, values[0]);
	            ps.setString(2, values[1]);
	            ps.setString(3, values[2]);
	            ps.setString(4, values[3]);  
	            ps.addBatch();
	         
	            i++;
	        
	        }   
	        System.out.println(i+" Datensätze wurden in die Batch geschrieben");  
	        ps.executeBatch();
	        System.out.println(i+" Datensätze wurden in die DB geschrieben");
	        br.close();
	        stmt.close();

jemand eine Idee wieso es so langsam ist ?

Genauer : das ps.executeBatch() brauch die 15 min ^^
MFG
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
P PreparedStatement batch und getGeneratedKeys Datenbankprogrammierung 7
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
L Oracle SQL Inserts via Client vs SQL Datei via ScriptRunner Datenbankprogrammierung 6
G HSQLDB Inserts/Updates sind nach Neustart der Anwendung Datenbankprogrammierung 1
J Mehrere Inserts bei Fehlschlag abbrechen Datenbankprogrammierung 2
D Frage zu INSERTS über mehrere Datenbanktabellen Datenbankprogrammierung 3
M SQL inserts bringen Router zum Absturz Datenbankprogrammierung 8
H Inserts in 2 Tabellen 1:n Datenbankprogrammierung 6
alexpetri Problem mit jdbc MS Access / nach 670 inserts ist schluss. Datenbankprogrammierung 4
M executeBatch() - Inserts trotz Fehler weitermachen Datenbankprogrammierung 5
rambozola große anzahl an inserts bei oracle db unperformant Datenbankprogrammierung 15
T Oracle Resultset to Array sehr langsam. Datenbankprogrammierung 8
K MySQL PreparedStatedment ist zu langsam? Datenbankprogrammierung 9
P MySQL Datenbank an manchen PCs langsam Datenbankprogrammierung 11
S MySQL Auslesung Datenbank sehr langsam Datenbankprogrammierung 16
P MySQL Verbindung nach außen sehr langsam Datenbankprogrammierung 4
M Datenbankverbindung zu langsam beim Insert? Datenbankprogrammierung 6
B H2 H2 executeQuery ist sehr langsam Datenbankprogrammierung 8
R ODBC-Treiber sehr langsam Datenbankprogrammierung 5
F JDBC:Mysql extrem Langsam Datenbankprogrammierung 3
E MSSQL-Server connection aufbau sehr langsam Datenbankprogrammierung 2
B Mysql über jdbc sehr langsam Datenbankprogrammierung 4
V PostgreSQL langsam (Blob) Datenbankprogrammierung 10
Z jdbc-Verbundung unter Windows zur Postgresql DB sehr langsam Datenbankprogrammierung 3
L insert in Access-DB sehr langsam!? Datenbankprogrammierung 6
G Select-Abfragen sind sehr langsam Datenbankprogrammierung 7

Ähnliche Java Themen


Oben