Bom pessoal, minha dúvida é a seguinte.
Tenho uma lista com mais de 6.000.000 de registros, ao realizar um for dessa lista para criar os objetos no BD fica muito carregado e começa a dar OutOfMemory.
Eu gostaria de saber se tem uma maneira de criar essa lista pelo hibernete de alguma forma sem ser necessário fazer um for, ele chega a gravar 1.000.000 de registros, mas começa a travar e dai vem os erros de memoria.
Segue o meu código.
public void create(List<TributoCliProd> listTributo) {
EntityManager em = null;
try {
em = getEntityManager();
for (int i = 0; i < listTributo.size(); i++) {
em.getTransaction().begin();
em.persist(listTributo.get(i));
em.getTransaction().commit();
}
} finally {
if (em != null) {
em.close();
}
}
}
Ou assim
public void create(List<TributoCliProd> listTributo) {
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
for (int i = 0; i < listTributo.size(); i++) {
em.persist(listTributo.get(i));
}
em.getTransaction().commit();
} finally {
if (em != null) {
em.close();
}
}
}
Ou até mesmo na base do antigo
public void criaSql(List<TributoCliProd> listTributo) {
if (ConexaoAuxiliar.conecta()) {
for (int i = 0; i < listTributo.size(); i++) {
try {
ConexaoAuxiliar.getStm().executeUpdate("INSERT INTO TRIBUTOCLIPROD"
+ "(CODIGO_FINALIDADE, CODIGO_PESSOA, "
+ "CODIGO_PRODSERV) VALUES(" + listTributo.get(i).getFinalidade().getCodigo_finalidade() + ","
+ listTributo.get(i).getPessoa().getCodigo_pessoa() + ", "
+ listTributo.get(i).getProdServ().getCodigo_produto() + " )");
} catch (SQLException ex) {
Logger.getLogger(TributoCliProdJpaController.class.getName()).log(Level.SEVERE, null, ex);
ConexaoAuxiliar.fechaConexao();
}
}
ConexaoAuxiliar.fechaConexao();
} else {
System.out.println("Erro ao cenectar.");
}
}
todos esses métodos me retornam o mesmo erro devido a grande quantia de registros.