Stapeleinfügung mit einer Tabelle mit vielen Spalten mit Anorm
Ich versuche, mithilfe von Anorm (im Play Framework 2.3.1) eine Stapeleinfügung in eine MySQL-Datenbanktabelle durchzuführen. Die Anwendung, die ich erstelle, verfügt über ein Standard-Web-Front-End und erfordert Batch-Dateneinsätze. Ich möchte versuchen, die Logik auf demselben Software-Stack zu belassen.
Die Beilagen gehen nur in die gleichen wenigen Tabellen.
Die Anzahl der Zeilen, die gleichzeitig eingefügt werden sollen, wird Hunderte erreichen und kann Tausende erreichen. Ich gehe davon aus, dass ich die Anzahl der eingefügten Zeilen aufgrund von anorm / mysql / anderen Einschränkungen möglicherweise irgendwann begrenzen muss.
Der von mir verwendete MySQL-Treiber ist mysql-connector-java - 5.1.31
Nachfolgend finden Sie einen kurzen Anwendungsfall.
Mit tisch:
CREATE TABLE table1
(
col1 INTEGER NOT NULL,
col2 BIGINT,
col3 VARCHAR(255)
);
Und Scala-Code:
import play.api.Play.current
import play.api.db.DB
import anorm._
object TestInserts {
DB.withConnection("spo") { implicit conn =>
val theInserts = Seq(
Seq[NamedParameter]('val1 -> 1, 'val2 -> Some(1L), 'val3 -> Some("One"))
,Seq[NamedParameter]('val1 -> 2, 'val2 -> Some(2L), 'val3 -> Some("Two"))
,Seq[NamedParameter]('val1 -> 3, 'val2 -> Some(3L), 'val3 -> Some("Three"))
)
val insertBatchSQL = BatchSql( SQL("insert into table1 (col1, col2, col3) values ({val1}, {val2}, {val3})"), theInserts)
insertBatchSQL.execute
}
}
Ich erhalte den folgenden Fehler
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:997)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:983)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:928)
at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3688)
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3670)
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3715)
at com.mysql.jdbc.PreparedStatement.setInt(PreparedStatement.java:3659)
at com.jolbox.bonecp.PreparedStatementHandle.setInt(PreparedStatementHandle.java:828)
at anorm.ToStatement$intToStatement$.set(ToStatement.scala:164)
at anorm.ToStatement$intToStatement$.set(ToStatement.scala:163)
...
Ich habe mir die Testklassen im Play-Framework angesehen, die die Stapeleinfügung testenhttps://github.com/playframework/playframework/blob/master/framework/src/anorm/src/test/scala/anorm/BatchSqlSpec.scala und soweit ich das beurteilen kann sollte es genauso funktionieren.
Alle Hinweise, wie man das behebt oder ob ich das anders angehen sollte, wären großartig.