Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Desktop Java - como separar o acesso ao banco de dados do thread da interface do usuário?


Parece que suas consultas de banco de dados são executadas a partir do thread da interface do usuário, mesmo que você diga que uma tarefa agendada executa as consultas (?). Para ter certeza, você pode imprimir um stacktrace onde você acessa o banco de dados:
new Exception().printStacktrace();

Para a solução proposta:parece um design decente se suas consultas de banco de dados forem lentas e, caso contrário, congelariam sua interface do usuário. Você pode implementar um sistema de eventos entre sua camada de interface do usuário e a camada db, talvez uma abordagem simples baseada em fila.

EDITAR:

Existem exemplos mais prováveis ​​para descobrir como implementar uma solução baseada em eventos.

Isenção de responsabilidade:há muitos anos não faço nenhuma programação de interface do usuário real.
  1. O usuário clica em um botão na interface do usuário. O encadeamento da interface do usuário coloca um objeto de evento (DataWantedEvent) em uma fila (java.util.Queue), altera um rótulo ("Aguardando dados...") e, em seguida, continua e aguarda outras interações do usuário.
  2. O encadeamento da camada db pega o evento da fila e consulta o banco de dados. O resultado é postado de volta em outra fila em um objeto de resultado.
  3. Um encadeamento de IU (provavelmente não o encadeamento principal) pega o objeto de resultado da fila de resultados e atualiza a IU.

Uma fila para postar objetos de resultado de volta para a interface do usuário pode não ser necessária. Um método de atualização pode ser invocado diretamente.

Se o usuário clicar em um botão cancelar, o evento/retorno de chamada de atualização poderá ser ignorado ou, se possível, a consulta db poderá ser cancelada.