JDBC PreparedStatement Batch Fortsetzen Einfügen bei Fehler
Hallo Kerl, ich erstelle einen Stapel mit einemPreparedStatement
in Java wie folgt
for(Item item: list){
ps.setString(1, item.getSome());
ps.setString(2, item.getFoo());
ps.setString(3, item.getBatman());
statement.addBatch();
if (++count % batchSize == 0) {
results = ps.executeBatch(); //execute parcial batch
if (results != null)
System.out.println(results.length);
}
}
results= ps.executeBatch(); //execute rest of batch
Der Datenbankserver ist ein MySQL-Server, in der Tabelle zum Einfügen habe ich mehrere Einschränkungen
Durch diese Einschränkungen beim Einfügen erzeugt Fehler
Ich möchte den Batch ausführen und Fehler auslassen, wirf in diesem Moment eine Exception und beende Batch
Bevor ich den Batch erstelle, habe ich einen Big für den Save nach dem anderen wie
//seudocode level
For item
Try{
insert item
}catch(E){nothing happens}
Aber es ist sehr langsam, in einigen Fällen verarbeitet der Stapel 4000 Elemente, fügt 1500 ein und lässt den Rest weg
Wie mache ich mit dem Batch?
BEARBEITE
Ich verwende Weblogic, um Verbindungen mit diesem Treiber herzustellen.mysql-connector-java-commercial-5.0.3-bin
Ich teste diese Eigenschaften
1.
continueBatchOnError=true
2.
rewriteBatchedStatements=true
3
continueBatchOnError=true
rewriteBatchedStatements=true
Und füge @ hinconnection.setAutoCommit(false);
wirft aber weiterhin die Ausnahme in Duplikaten
BEARBEITE
vergessen zu erwähnen, ich benutze für die Verbindung Hibernate + Spring
Das einzige For-Save-Beispiel wurde im Ruhezustand erstellt, aber für die Leistung habe ich versucht, einen JDBC-Stapel zu verwenden. Bei anderen Prozessen in der Webanwendung wird auch JDBC mit der Verbindung aus dem Ruhezustand verwendet und funktioniert gut.
Dies ist der vollständige Code
@Transactional
public void saveMany(final List<Item> items) {
getMySqlSession().doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
StringBuilder sb = new StringBuilder();
sb.append("INSERT INTO `FRT_DB`.`ITEM` ");
, sb.append("( ");
sb.append("`masterID`, ");
sb.append("`agent`, ");
sb.append("`rangeID`) ");
sb.append("VALUES ");
sb.append("( ");
sb.append("?, ");
sb.append("?, ");
sb.append("?) ");
int[] results = null;
PreparedStatement ps = null;
try {
connection.setAutoCommit(false);
ps = connection.prepareStatement(sb.toString());
final int batchSize = 250;
int count = 0;
for (Item item : items) {
if (item.getMasterId() != null) {
ps.setInt(1, item.getMasterId());
} else
ps.setNull(1, java.sql.Types.INTEGER);
if (item.getAgent() != null) {
ps.setString(2, item.getAgent());
} else
ps.setNull(2, Types.VARCHAR);
if (item.getRangeId() != null)
ps.setInt(3, item.getRangeId());
else
ps.setNull(3, Types.INTEGER);
ps.addBatch();
if (++count % batchSize == 0) {
results = ps.executeBatch();
if (results != null)
System.out.println(results.length);
}
}
results= ps.executeBatch();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
Dieses Erzeugnis nächste Ausnahme
java.sql.BatchUpdateException: Doppelter Eintrag '1-000002725' für Schlüssel 'masterID'
Aber ich muss weitermachen
spring + Hibernate-Einstellungen beeinträchtigen die Eigenschaften von jdbc? Ich weiß es nich