sql >> Base de Datos >  >> RDS >> Mysql

Escritorio de Java:¿cómo separar el acceso a la base de datos del subproceso de la interfaz de usuario?

Parece que sus consultas de base de datos se ejecutan desde el subproceso de la interfaz de usuario aunque diga que una tarea programada ejecuta las consultas (?). Para estar seguro, puede imprimir un seguimiento de pila donde accede a la base de datos:

new Exception().printStacktrace();

Pasando a su solución propuesta:parece un diseño decente si sus consultas de base de datos son lentas y, de lo contrario, congelarían su interfaz de usuario. Podría implementar un sistema de eventos entre su capa de interfaz de usuario y la capa de base de datos, tal vez un enfoque simple basado en cola.

EDITAR:

Hay ejemplos muy probables para encontrar cómo implementar una solución basada en eventos.

Descargo de responsabilidad:no he hecho ninguna programación de interfaz de usuario real en muchos años.

  1. El usuario hace clic en un botón en la interfaz de usuario. El subproceso de la interfaz de usuario coloca un objeto de evento (DataWantedEvent) en una cola (java.util.Queue), cambia una etiqueta ("Esperando datos...") y luego continúa y espera otras interacciones del usuario.
  2. El hilo de la capa db toma el evento de la cola y consulta la base de datos. El resultado se vuelve a publicar en otra cola en un objeto de resultado.
  3. Un hilo de la interfaz de usuario (probablemente no el hilo principal) toma el objeto de resultado de la cola de resultados y actualiza la interfaz de usuario.

Es posible que no se necesite una cola para publicar objetos de resultados en la interfaz de usuario. Se podría invocar directamente un método de actualización.

Si el usuario hace clic en un botón de cancelación, el evento de actualización/devolución de llamada podría ignorarse o, si es posible, la consulta de base de datos podría cancelarse.