O lote PreparedStatement do JDBC continua a inserir com erro
Olá cara, eu crio um lote com umPreparedStatement
em java assim
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
O servidor do datebase é um MySQL, na tabela para inserir tenho várias restrições
Por essas restrições quando insiro gera erros
Quero executar o lote e omitir erros, neste momento, lance uma exceção e um lote final
Antes de criar o lote, tenho um Big para salvar um por um, como
//seudocode level
For item
Try{
insert item
}catch(E){nothing happens}
Mas é muito lento, em alguns casos, o lote processa 4000 itens, insere 1500 e omite o restante
Como eu faço com o lote?
EDITAR
Eu uso o weblogic para fazer conexões com este drivermysql-connector-java-commercial-5.0.3-bin
Eu testo essas propriedades
1
continueBatchOnError=true
2)
rewriteBatchedStatements=true
3)
continueBatchOnError=true
rewriteBatchedStatements=true
E adicioneconnection.setAutoCommit(false);
mas continua a lançar a exceção em duplicatas
EDITAR
esqueci de mencionar, eu uso para conexão Hibernate + Spring
O único exemplo For-Save é feito no Hibernate, mas, para o desempenho, tentei usar um lote JDBC, em outros processos no aplicativo da web também use o JDBC com a conexão do Hibernate e funcione bem.
Este é o código completo
@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();
}
}
});
}
Isso produz a próxima exceção
java.sql.BatchUpdateException: entrada duplicada '1-000002725' para a chave 'masterID'
Mas preciso continuar
configurações de hibernação + primavera interferem nas propriedades do jdbc? Eu não sei