MySQL PreparedStatement vs. StoredProcedure vs. executeBatch

Pantheos

Mitglied
Hallo zusammen!

Ich habe eine grundlegende Frage bezüglich Speichern in einer MySQL DB

Nehmen wir diese Klasse:
Java:
public class DummyObj 
{
public int intvalue;
public String stringvalue;

public DummyObj()
{
	intvalue=123456;
	stringvalue="awdawd";
}
}

und füllen eine Liste mit Objekten der Klasse
Java:
int i;
dummyliste = new ArrayList<DummyObj>();
for (i=0; i<100000; i++)
{
	DummyObj dummy = new DummyObj();
	dummyliste.add(dummy);
}

Nun möchte ich diese Liste in diese MysqlTabelle speichern:
SQL:
CREATE TABLE `testtable` (
  `idtesttable` int(11) NOT NULL AUTO_INCREMENT,
  `stringvalue` varchar(45) DEFAULT NULL,
  `intvalue` int(11) DEFAULT NULL,
  PRIMARY KEY (`idtesttable`)
)

Folgende Möglichkeiten ergeben sich mir:

Methode 1 - mit Stored Procedure:
ich habe diese StoredProcedure auf meinem MySQLServer
SQL:
PROCEDURE `inserttest`(
	IN v_teststring VARCHAR(45),
	IN v_testint INT
)
BEGIN
INSERT INTO testtable
SET stringvalue=v_teststring, intvalue=v_testint;
END
und rufe sie in meinem JavaCode auf
[Java]
Connection con = DriverManager.getConnection(connectionString);
int j;
CallableStatement cstmt = con.prepareCall("call inserttest(?, ?)");
for (j=0; j<dummyliste.size();j++)
{
cstmt.setString(1, dummyliste.get(j).stringvalue);
cstmt.setInt(2, dummyliste.get(j).intvalue);
cstmt.execute();
}
[/code]

Methode 2 - Prepared Statement
Java:
Connection con = DriverManager.getConnection(connectionString);
int j;
PreparedStatement pstmt = con.prepareStatement("INSERT INTO testtable SET stringvalue=?, intvalue=?;");
for (j=0; j<dummyliste.size();j++)
{				
	pstmt.setString(1, dummyliste.get(j).stringvalue);
	pstmt.setInt(2, dummyliste.get(j).intvalue);
	pstmt.executeUpdate();
}

Methode 3 - Statement mit Batch
Java:
Connection con = DriverManager.getConnection(connectionString);
int j;
Statement stmt = con.createStatement();
for (j=0; j<dummyliste.size();j++)
{
	stmt.addBatch("INSERT INTO testtable SET stringvalue=\""+dummyliste.get(j).stringvalue+"\", intvalue="+dummyliste.get(j).intvalue+";");
}
stmt.executeBatch();

Ich habe es gerade seperat mit allein 3 Methode getestet und konnte keine bedeutsamen Geschwindigkeitsunterschiede festestellen, Methode 2 und 3 waren sogar identisch
Gibt es sonstige Gründe, warum man die eine Methode der anderen vorziehen sollte oder eben nicht?

Grüße
Stefan

Edit: Fehler / Formatierung korrigiert
 
Zuletzt bearbeitet:

stg

Top Contributor
Mit StoredProcedures bist du in der Lage deine Abfrage hochgradig auf die von dir genutzte Datenbank zu optimieren und (sofern alles richtig gemacht wird) auch die bestmögliche Performance herauszukitzeln. Der Große Nachteil ist jedoch, dass deine SPs in der Regel nicht portabel sind. Wenn du andere Datenbanken nutzen willst, musst du im schlimmsten Fall alles neu machen.

PreparedStatement werden für dich automatisch seitens des Anbieters des Treibers bereits mehr oder weniger gut optimiert. Bei einer einzigen Abfrage hinkt die Performance vermutlich der einer "normalen" Abfrage deutlich hinterher. Wenn du hingegen sehr viele Abfrage während der selben bestehenden Datenbankverbindung abschickst, dann solltest du hier einen deutlichen Performancegewinn feststellen.

Normale Statements sind im Vergleich zu PreparedStatements sehr anfällig für SQL-injections. Ich würde sie nur einsetzen, wenn der Anwender keinen Einfluss auf die Abfrage hat und es tatsächlich auf Performance bei einzelnen Abfragen ankommt.
 
Ä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 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
T MySQL PreparedStatement mit INSERTs langsam, Batch-Statement auch Datenbankprogrammierung 4
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
K Keine ResultSet bei if in StoredProcedure Datenbankprogrammierung 16
S executeBatch result immet mit Statement.SUCCESS_NO_INFO Datenbankprogrammierung 4
M werden executeBatch()-commandos automatisch commitet ? Datenbankprogrammierung 8
M executeBatch() - Inserts trotz Fehler weitermachen Datenbankprogrammierung 5

Ähnliche Java Themen


Oben