Olá, Tenho uma aplicação que consiste de colar um arquivo (.doc | .docx | .odt) em um editor Fckeditor ou fazer upload de um arquivo de texo das extensões supracitadas, aplicar uma conversão para html (docx4j) e jogar no editor e mandar salvar no banco de dados, na verdade deveria funcionar parecido com um google docs. Acontece que esporadicamente temos algumas publicações grandes(um arquivo .docx de 200KB após convertido para html ficou com 3MB) e o mysql chiou. Então estou procurando alternativas para trabalhar com estes textos grandes para melhorar o consumo de memória e também a performance do banco de dados. No momento de carregar o texto existe a possibilidade de carregamento sob demanda? No momento de salvar eu vou lendo o texto e a cada 10000 linhas eu dou um update, essa estratégia é bacana? alguma dica?
código no managed bean
public String salvar() {
try {
Path path = FileSystems.getDefault().getPath(System.getenv("HOME"),"temp");
String filePath = path.toAbsolutePath().toString() + FileSystems.getDefault().getSeparator() + UUID.randomUUID()+".txt";
FileOutputStream fos = new FileOutputStream(filePath);
fos.write(materia.getTexto().getBytes());
fos.close();
Scanner sc = new Scanner(new File(filePath));
int numeroLinhas = 0;
StringBuffer sb = new StringBuffer();
while(sc.hasNextLine()) {
String linha = sc.nextLine();
sb.append(linha);
if(numeroLinhas == 10000) {
String conteudo = StringEscapeUtils.unescapeHtml4(sb.toString());
materiaService.updateIncremental(materia.getMateriaId(), conteudo);
sb = new StringBuffer();
numeroLinhas = 0;
}
numeroLinhas++;
}
if(!sc.hasNextLine()) {
String conteudo = StringEscapeUtils.unescapeHtml4(sb.toString());
materiaService.updateIncremental(materia.getMateriaId(), conteudo);
}
sc.close();
} catch (Exception e) {
e.printStackTrace();
}
return "ListaDiarios";
}
implementação no repository
public void alterarMateriaIncremental(Integer materiaId,String texto) {
Query updateQuery = manager.createNativeQuery("UPDATE materia SET texto = CONCAT(texto,:texto) WHERE materia_id =:id ");
updateQuery.setParameter("texto", texto);
updateQuery.setParameter("id",materiaId);
updateQuery.executeUpdate();
}