Pergunta

Eu tenho um site em que o usuário pode fazer upload de uma planilha do Excel para carregar dados em uma tabela. Pode haver algumas 100 mil linhas na planilha do Excel. Quando ele carrega o arquivo, o site precisa inserir uma quantidade igual de linhas em uma tabela de banco de dados.

Que estratégia devo levar para fazer isso? Eu estava pensando em exibir uma "página de espera" até que a operação seja concluída, mas quero que ele possa continuar navegando no site. Além disso, como o banco de dados naquela época estará meio ocupado - isso não impediria as pessoas de trabalhar no site?

Minha camada de acesso a dados está em Nibernate.

Obrigado, y

Foi útil?

Solução

Exibir uma página de espera seria bastante hostil, pois seu usuário poderia estar agitando um bom tempo e bloqueia threads no seu servidor da Web.

Eu carregava o arquivo, o armazenava e criaria uma entrada em uma fila (você precisará de uma tabela de anúncios para isso) para indicar que há um arquivo esperando para ser processado. Você pode ter outro processo (que pode até ser executado em seu próprio servidor) que capta tarefas desta tabela de filas e processa o arquivo XLS no seu tempo.

Outras dicas

Eu criaria uma fila de upload que enviaria essa solicitação. Em seguida, o usuário pode simplesmente verificar a fila de vez em quando. Você pode armazenar o progresso da operação em lote na fila à medida que as linhas são processadas.

Além disso, os servidores de banco de dados são sistemas robustos, poderosos e multitarefa. A menos que você tenha observado um problema com o site enquanto as inserções estão acontecendo, não assuma que ele impede as pessoas de trabalharem no site.

No entanto, no que diz respeito à inserção ou performance de leitura/gravação simultânea, existem mecanismos para lidar com isso. Você pode usar a sintaxe "Inserir baixa prioridade" no MySQL ou fazer com que o aplicativo acelere as inserções dormindo um milissegundo entre cada inserção. Além disso, como você cria suas declarações de inserção, se você usa parâmetros vinculados ou não, e se você usa inserções com vários valores, pode afetar o desempenho da inserção e como isso afeta os clientes em grande parte.

No envio, você pode passar a operação do banco de dados para um requestHandler assíncrono e definir um valor de sessão quando estiver pronto.

Enquanto o processo assíncrono estiver em andamento, você pode verificar o valor da sessão em cada solicitação e se estiver definido (operação = concluído) exibir uma mensagem, por exemplo, em um mecanismo modal ou qualquer mensagem que você tenha.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top