Bom dia a todos,
trabalho numa empresa que está migrando um sistema desktop para a web e nessa odisséia surgiu o seguinte problema:
A parte de relatórios sempre foi um problema aqui dentro, pois o volume de dados no sistema tornou-se consideravelmente grande…
No inicio o select era executado e carregado todos os registros no java, porém, tornou-se inviável quando o volume cresceu…
Recuperar 500mil registros de uma vez, jogar tudo para a memória, manipulá-los…
Para resolver o problema, na época, foi feito a seguinte solução:
Criado um cursor no banco a partir do select, recuperá-los de 1, 10, X registros de cada vez para ai sim processá-los…
Passando todo o consumo de processamento/memória dos dados para o banco, que no caso, são bem robustos…
Ok, sem problemas…
Ao executar esse modelo na web, tivemos um problema com o pool de conexões…
Ocorrendo o seguinte cenário ao tirar um relátorio, com, por exemplo, 20 mil registros:
Banco: Cursor criado;
Java: loop para recuperar os dados
ResultSet rs = cursor.carregaRegistro( 1);
// processamento
Legal, iremos passar por esse loop 20mil vezes e criarmos 20 mil resultsets…
O problema?
Os pools de conexões (c3p0, dbcp) armazenam os resultsets executados durante a conexão em uma lista…
como uma forma de otimização, para caso quiser recuperar algum dado sem precisar executar a instrução novamente…
Legal, o que acham que ocorreu?
vazamento de memória!
Imagine, 20 mil resulsets armazenados, juntamente com seus dados carregados (strings, chars, doubles etc…) sem a possibilidade do GC limpá-los, pois a lista armazena suas referências…
Agora estamos num dilema, e queríamos alguma opinão sobre alguém que tivesse passado pelo mesmo problema…
Pensamos em implantar nosso próprio pool, pois não usamos nenhum recurso extra que os frameswork nos proporcionam… Porém iriamos ficar mais distante de um servidor de aplicação quando/se o mesmo for necessário
Pensamos também em repensar o modelo de como manipulamos nossa gama de dados (o mais obvio)… com certeza está longe do ideal… mas como disse… em nossa arquitetura ele funciona bem e até poderiamos sofrer resistência de uma nova implementação… Caso alguém recomendar algum artigo sobre, ficaria muito grato!
Obrigado pela atenção…