MySql JDBC Batch Performance

Hallo zusammen,

ich habe eine Anwendung geschrieben, die mit einer MySql-Datenbank arbeitet.
Die Datenbank liegt lokal auf dem Rechner.
Im Internet lese ich ständig, dass das Erzeugen / Updaten von Datensätzen mit einem Batch schneller sein soll, als wenn man die Datensätze einzeln erzeugt.

Ich habe einen kleinen Test geschrieben, der jeweils 1000 Datensätze erzeugt. Ein mal mit Hilfe eines PreparedStatements, das wiederholt aufgerufen wird, und ein mal (das gleiche Statement) mit einem Batch.

Das Erzeugen mit dem PreparedStatement dauert zwischen 5 und 6 Sekunden.
Das Erzeugen mit dem Batch allerdings immer eine Sekunde länger!

Ich verstehe aber nicht warum. Wie kann das sein?
Liegt es möglicherweise am JDBC Treiber? Oder an MySql?
Oder ist der Batch nur vorteilhaft, wenn die Anfrage über ein Netzwerk gesendet wird?

Wäre schön, wenn da jemand klarheit schaffen könnte.
Danke!

Hallo,

Das Erzeugen mit dem PreparedStatement dauert zwischen 5 und 6
Sekunden.
Das Erzeugen mit dem Batch allerdings immer eine Sekunde
länger!

Ich verstehe aber nicht warum. Wie kann das sein?
Liegt es möglicherweise am JDBC Treiber? Oder an MySql?
Oder ist der Batch nur vorteilhaft, wenn die Anfrage über ein
Netzwerk gesendet wird?

Die Performance dürfte sowohl vom Treiber als auch von der Datenbank abhängen. In einem Quick ‚n‘ Dirty Test waren bei mir die Version mit und ohne Batch ziemlich gleich schnell. Nach setzten der hier erwähnten Parameter für MySQL useServerPrepStmts und rewriteBatchedStatements war die Batch Variante jedoch deutlich schneller: https://stackoverflow.com/questions/2993251/jdbc-bat…

Quick ‚n‘ Dirty (Groovy) Code:

 Class.forName('com.mysql.jdbc.Driver')
 def con = DriverManager.getConnection('jdbc:mysql://localhost:3306/test?useServerPrepStmts=false&rewriteBatchedStatements=true','user','password')

 def ps = con.prepareStatement('insert into batch\_test(text) values(?)')

 def start = System.currentTimeMillis()
 for(int i=0; i

Ausgabe:
duration 12593 ms (no batch)
duration 481 ms (batch)

HTH
Heavy

Super! Danke für die Antwort. War sehr Hilfreich.