Melhor performance para incluir dados via jdbc

2 respostas
jemoliveira

Tenho mais de 15 mil registro para incluir no meu banco, isso todos os dias...criei uma rotina para fazer isso, mais acho que esta demorando de mais, vcs sabem uma forma q o desempenho seja melhor?

private static final String INSERT_ALL = "INSERT INTO TB_CM_CREDIT_LIMIT_EXP (ASC_CODE,CREDIT_LIMIT_EXP) VALUES (";
private void insertDestiny(List<CreditLimit> ls)throws SQLException{
		oracleConn = mngt.getConnection(DB_NAME.ORACLE_DEV);

		PreparedStatement pstmt = null;		
		for(int i=0; i < ls.size(); i++){
			CreditLimit vo = ls.get(i);
			String teste  = INSERT_ALL + "" + vo.getAscCode() + ',' + vo.getCreditLimit() + ")";			
			pstmt = oracleConn.prepareStatement(teste);			
			pstmt.addBatch();			
			pstmt.executeBatch();
		}
		
		pstmt.close();
		oracleConn.close();
	}

2 Respostas

A

Você está utilizando os objetos certos da maneira errada.

Veja aqui um exemplo de como poderia fazer:
http://www.guj.com.br/16204-como-inserir-varios-registros-no-mysql-em-um-so-insert#answer-22046

Duas coisas que deve notar:

  • Não concatene os valores na query, use parâmetros e ? na query
  • Não adianta usar addBatch e executeBatch em seguida, agrupe em grupos vários addBatch, para depois executar.
ViniGodoy
//Use parâmetros nas suas queries. Isso evita injeção de dependências, ter que formatar dados e erros 
//caso tenha um apóstrofe nos meios dos dados
private static final INSERT INTO TB_CM_CREDIT_LIMIT_EXP (ASC_CODE,CREDIT_LIMIT_EXP) VALUES (?,?)";

//Define o tamanho do batch - de quantos em quantos registros chamaremos o executeBatch()
private static final int BATCH_SIZE = 50;

private void insertDestiny(List<CreditLimit> ls)throws SQLException{
   //Use o try with resources para garantir que a conexão e o statement serão fechados
    try (
        Connection oracleConn = mngt.getConnection(DB_NAME.ORACLE_DEV);
        PreparedStatement pstmt = oracleConn.prepareStatement(teste)
    ) {
        int batch = 0;
        //Com for each fica mais legível, e não terá impacto 
        //de performance se lista for um LinkedList
        for(CreditLimit vo : ls){
            //É assim que se define os parâmetros
            pstmt.setInt(1, vo.getAscCode());
            pstmt.setDouble(2, vo.getCreditLimit());
            pstmt.addBatch();

            //Chamamos execute batch a cada BATCH_LIMIT registros inseridos
            if (++batch == BATCH_LIMIT) {
    	        pstmt.executeBatch();
                batch = 0;
            }
        }
        //Para garantir que os últimos registros também serão adicionados
        pstmt.executeBatch();
    }
}
Criado 20 de março de 2014
Ultima resposta 21 de mar. de 2014
Respostas 2
Participantes 3