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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage