Auf Thema antworten

Hallo zusammen!


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


Nehmen wir diese Klasse:

[code=Java]

public class DummyObj

{

public int intvalue;

public String stringvalue;


public DummyObj()

{

    intvalue=123456;

    stringvalue="awdawd";

}

}

[/code]


und füllen eine Liste mit Objekten der Klasse

[code=Java]

int i;

dummyliste = new ArrayList<DummyObj>();

for (i=0; i<100000; i++)

{

    DummyObj dummy = new DummyObj();

    dummyliste.add(dummy);

}

[/code]


Nun möchte ich diese Liste in diese MysqlTabelle speichern:

[code=sql]

CREATE TABLE `testtable` (

  `idtesttable` int(11) NOT NULL AUTO_INCREMENT,

  `stringvalue` varchar(45) DEFAULT NULL,

  `intvalue` int(11) DEFAULT NULL,

  PRIMARY KEY (`idtesttable`)

)

[/code]


Folgende Möglichkeiten ergeben sich mir:


Methode 1 - mit Stored Procedure:

ich habe diese StoredProcedure auf meinem MySQLServer

[code=sql]PROCEDURE `inserttest`(

    IN v_teststring VARCHAR(45),

    IN v_testint INT

)

BEGIN

INSERT INTO testtable

SET stringvalue=v_teststring, intvalue=v_testint;

END

[/code]

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

[code=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();

}

[/code]


Methode 3 - Statement mit Batch

[code=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();

[/code]


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



Oben