Sincronização de Informações entre os Bancos de Dados

Esta documentação tem como objetivo explicar o funcionamento da sincronização de informações entre as tabelas comum.usuario, comum.pessoa e rh.servidor dos três bancos de dados utilizados pelos sistemas institucionais. Cada uma das tabelas será explicada em um dos tópicos abaixo.

Os dados pessoais não são sincronizados automaticamente entre os bancos por um timer. A sincronização dos dados pessoais normalmente é feita de duas formas: ou ela é realizada sempre que um dado pessoal é alterado em um dos sistemas ou então é feita de forma indireta, dependendo da sincronização de outras informações para ser feita como, por exemplo, os dados de alunos ou os dados de servidores. Assim, ao migrar alunos do banco acadêmico para o banco administrativo, os dados pessoais dos alunos também são migrados.

Sempre que for necessário modificar dados pessoais, é necessário chamar uma classe da arquitetura para que as modificações sejam propagadas para todos os bancos de dados. A classe em questão é a classe SincronizadorPessoas, do pacote br.ufrn.comum.sincronizacao. Essa classe possui um método chamado sincronizarPessoa(), que recebe como parâmetro uma pessoa e sincroniza os seus dados no banco cujo datasource foi passado para classe através do Factory Method usandoDataSource(). Possui ainda um método estático chamado getNextIdPessoa(), que tem como objetivo buscar o próximo identificador disponível para uma pessoa utilizando a sequence pessoa_seq, do banco comum. Isso significa que todas as pessoas de todos os sistemas terão o id gerado por essa sequence, para evitar que haja uma inconsistência entre os identificadores nos três bancos de dados.

Os passos necessários para se chamar a sincronização de dados pessoais são os seguintes: primeiro, utiliza-se o método estático usandoDataSource() da classe SincronizadorPessoas passando o datasource do banco de destino dos dados. Em seguida, chama-se o método sincronizarPessoa() da classe. Com isso, a classe irá verificar se a pessoa passada como parâmetro já existe no banco. Se existir, apenas atualiza os dados. Se não existir, insere utilizando como o identificador o id que estiver no objeto pessoa passado como parâmetro. Para setar o id da pessoa, usa-se o método getNextIdPessoa().

O método de sincronização deve ser chamado para cada datasource para o qual se deseja migrar os dados. Um exemplo de código pode ser visto abaixo:

int id = SincronizadorPessoas.getNextIdPessoa();
pessoa.setId(id);
SincronizadorPessoas.usandoDataSource(Database.getInstance().getComumDs()).sincronizarPessoa(pessoa);
SincronizadorPessoas.usandoDataSource(Database.getInstance().getSigaaDs()).sincronizarPessoa(pessoa);
SincronizadorPessoas.usandoDataSource(Database.getInstance().getSipacDs()).sincronizarPessoa(pessoa);

É importante ressaltar que, nesse caso, não é necessário verificar se um sistema está ativo ou não, pois caso o datasource não seja encontrado, nada será feito. Para isso, foi utilizada uma implementação do padrão de projeto Null Object.

A sincronização de usuários é feita de modo semelhante à sincronização de pessoas. Ela não é feita automaticamente por nenhum timer, e sim, chamada sempre que alguma informação de um usuário for modificada em algum dos sistemas. Assim como existe a classe SincronizadorPessoas para a sincronização dos dados pessoais, existe a classe SincronizadorUsuarios para a sincronização dos dados de usuários.

A utilização da classe SincronizadorUsuarios é igual à utilização da classe SincronizadorPessoas. Ela é instanciada através do Factory Method usandoDataSource(), para o qual passamos o datasource que receberá os dados sincronizados. Em seguida, podemos chamar o método sincronizarUsuario(), que irá verificar se o usuário já existe no banco de destino. Se existir, atualiza seus dados, senão, insere no banco. A classe SincronizadorUsuarios também possui um método estático chamado getNextIdUsuario() para gerar o próximo identificador disponível para o usuário. A sequence usada é a comum.usuario_seq, do banco sistemas_comum.

A utilização da classe SincronizadorUsuarios é semelhante a SincronizadorPessoas, conforme pode-se ver abaixo:

int id = SincronizadorUsuarios.getNextIdUsuario();
usuario.setId(id);
SincronizadorUsuario.usandoDataSource(Database.getInstance().getComumDs()).sincronizarUsuario(usuario);
SincronizadorUsuario.usandoDataSource(Database.getInstance().getSigaaDs()).sincronizarUsuario(usuario);
SincronizadorUsuario.usandoDataSource(Database.getInstance().getSipacDs()).sincronizarUsuario(usuario);

Sincronização com Base LDAP

As informações básicas de usuários (login e senha) ficam armazenadas também em um diretório LDAP para que seja possível utilizar o mesmo login e senha dos sistemas em outros serviços da instituição, como e-mail ou acesso a periódicos da CAPES. As informações dos usuários são sincronizadas cada vez que um usuário se loga nos sistemas através da classe UsuarioLDAP, do pacote br.ufrn.arq.usuarios.

A classe UsuarioLDAP é uma thread que é iniciada a cada login. A thread será responsável por sincronizar as informações do usuário que acabou de se logar.

A sincronização de servidores é feita a partir do banco administrativo para os demais bancos de dados. Assim, sempre que informações de servidores são atualizadas, por exemplo, através de uma importação de fita espelho no SIGPRH, elas são migradas para os demais bancos através de um timer. O timer responsável pela realização dessa sincronização está implementado na classe TimerDadosRecursosHumanos, do pacote br.ufrn.sipac.arq.timers.rh.

Para que a sincronização de servidores funcione, é necessário apenas que o timer seja ativado através de sua adição à lista de timers na tabela infra.registro_timer.

  • desenvolvimento/especificacoes/arquitetura/sincronizacao_de_informacoes.txt
  • Última modificação: 2017/04/03 18:10
  • (edição externa)