Quero inserir várias linhas em uma tabela MySQL ao mesmo tempo usando Java. O número de linhas é dinâmico. No passado eu fazia ...
for (String element : array) {
myStatement.setString(1, element[0]);
myStatement.setString(2, element[1]);
myStatement.executeUpdate();
}
Eu gostaria de otimizar isso para usar a sintaxe compatível com MySQL:
INSERT INTO table (col1, col2) VALUES ('val1', 'val2'), ('val1', 'val2')[, ...]
mas com um PreparedStatement
não sei como fazer isso, pois não sei de antemão quantos elementos array
conterá. Se não for possível com um PreparedStatement
, de que outra forma posso fazer (e ainda escapar dos valores na matriz)?
java
mysql
jdbc
prepared-statement
batch-insert
Tom marthenal
fonte
fonte
connection.setAutoCommit(false);
e façaconnection.commit();
download.oracle.com/javase/tutorial/jdbc/basics/…i == entities.size()
Quando o driver MySQL é usado, você deve definir o parâmetro de conexão
rewriteBatchedStatements
como verdadeiro( jdbc:mysql://localhost:3306/TestDB?**rewriteBatchedStatements=true**)
.Com este parâmetro, a instrução é reescrita para inserção em massa quando a tabela é bloqueada apenas uma vez e os índices são atualizados apenas uma vez. Portanto, é muito mais rápido.
Sem esse parâmetro, a única vantagem é o código-fonte mais limpo.
fonte
5.1.45
versão do conector mysql.rewriteBatchedStatements=true
não há ganho de desempenho.Se você pode criar sua instrução sql dinamicamente, você pode fazer a seguinte solução alternativa:
fonte
Caso você tenha incremento automático na tabela e precise acessá-la ... você pode usar a seguinte abordagem ... Faça o teste antes de usar porque getGeneratedKeys () em Statement porque depende do driver usado. O código abaixo foi testado no Maria DB 10.0.12 e no driver Maria JDBC 1.2
Lembre-se de que aumentar o tamanho do lote melhora o desempenho apenas até certo ponto ... para minha configuração, aumentar o tamanho do lote acima de 500 estava realmente degradando o desempenho.
fonte
@Ali Shakiba seu código precisa de algumas modificações. Parte do erro:
Código atualizado:
fonte
myArray
tiver um comprimento maior do que esse limite, você encontrará uma exceção. No meu caso, tenho um limite de 1.000 linhas, o que provoca a necessidade de uma execução em lote, porque poderia estar atualizando potencialmente mais de 1.000 linhas em qualquer execução. Teoricamente, esse tipo de instrução deve funcionar bem se você souber que está inserindo menos do que o máximo permitido. Algo para se manter em mente.podemos enviar várias atualizações juntos em JDBC para enviar atualizações em lote.
podemos usar objetos Statement, PreparedStatement e CallableStatement para atualização de bacth com desabilitar autocommit
addBatch () e executeBatch () funções estão disponíveis com todos os objetos de instrução para ter BatchUpdate
aqui, o método addBatch () adiciona um conjunto de instruções ou parâmetros ao lote atual.
fonte