Estou desenvolvendo uma aplicação que vai rodar 1X por dia, tendo que conectar em um BD(ms sql), selecionar +/- 40.000 registros de uma tabela de cadastro de pessoas, ir navegando por estes registros, e de acordo com alguns critérios, ir alimentando um banco de dados em outro servidor(tb ms sql).
A restrição que tenho é que precisa ser uma aplicação console, sem qualquer gui ou interação humana, e nao pode ser web-based, j2ee ou coisa do gênero. Vai ser colocada em crontab.
Preciso que este programa nao consuma todos os recursos da máquina onde irá rodar(ou ao menos, não por muito tempo), pois esta serve outras aplicações.
Alguém tem sugestões/dicas/comentários de abordagem para esta solução? As coisas que devo evitar e as que devo buscar ao desenvolver.
Pela idéia que vc deu da aplicação, uma stored procedure até que poderia resolver isso bem… mas se as suas regras de negócio tem que ser em Java, então vc basicamente so tem um caminho a seguir:
public static void main(String[] args) {
...
}
O que evitar:
Fazer mais de uma conexao ao BD - se tudo o que vc vai fazer é mover uma cacetada de registros de um banco pro outro, duas Connections sao tudo o que vc precisa
O que pode ajudar:
Threads - se vc fizer uma Thread gerando informacoes (lendo de um dos BDs) e outra consumindo (INSERTando no outro), da pra distribuir melhor a carga se vc tiver mais de um processador na máquina.
O que seria legal pacas:
Deixar de fazer as coisas em batch (que tá definitivamente ficando muito “anos 90”) e fazer a coisa online, conforme as tabelas vao mudando. Não sei do MSSQL, mas pelo menos no Oracle dá pra fazer um belo dum DBLINK aqui (falei merda? :))…
Fazer mais de uma conexao ao BD - se tudo o que vc vai fazer é mover uma cacetada de registros de um banco pro outro, duas Connections sao tudo o que vc precisa
[/quote]
cv, evitar mais de uma conexão ao BD, sendo que duas Connections sao tudo o que ele precisa? Confuso isso… :?:
Como já trabalhei muito com MSSQL (já faz uns 2 anos …), vou tentar ajudar em alguma coisa.
Como o cv disse, uma stored procedure pode resolver bem o seu problema. No MSSQL tem como um banco “enxergar” outro em outra máquina sim. O que precisa ser feito é um “linked server”, e programação em Transact-SQL, que apesar de ser meio limitada em recursos, mas é uma mão na roda; pois evita trazer os dados do DBMS para o client (programa) e enviar para o outro banco (server); ou seja, é server to server. Se precisar colocar o agendamento no crontab (dependencia da execução de outros processos em shell-script/programas) tudo bem, mas se for somente para agendar esta “transferência de dados” o próprio MSSQL já tem um mecanismo de agendamento equivalente ao crontab do UNIX (se vc usa M$ é melhor deixar tudo M$ :shock: ).