Actualmente estoy trabajando en un proyecto mío (bastante grande), una aplicación Swing que por su propia naturaleza necesita ser multiproceso. Casi todas las interacciones del usuario pueden obtener datos de algunos servidores remotos a través de Internet, ya que no controlo estos servidores ni el Internet en sí mismo, por lo tanto, los tiempos de respuesta largos son inevitables. Es obvio que una UI Swing no puede volver a pintarse mientras el EDT está ocupado, por lo que todas las llamadas a servidores remotos deben ser ejecutadas por hilos de fondo.Administración de sesiones usando Hibernate en una * aplicación multi-threaded * Swing
Mi problema:
datos captados por los hilos de fondo consigue 'enriquecidas' con datos de una base de datos local (en memoria) (servidor remoto devuelve IDS/referencias a los datos en la base de datos local). Posteriormente, estos datos se pasan al EDT donde se convierte en parte del modelo de vista. Algunas entidades no se inicializan por completo en este punto (habilitación diferida), por lo que el usuario puede activar la recuperación diferida, p. Ej. desplazándose en una JTable. Como la sesión de hibernación ya está cerrada, se activará una LazyInitializationException. No puedo saber cuándo el usuario podría desencadenar la recuperación diferida, por lo que no será necesario crear una sesión bajo demanda/adjuntar el objeto separado.
I 'resuelto' este problema por:
- utilizando un único (sincronizado, ya que los casos de sesión no se thread-safe) Sesión para toda la aplicación
- deshabilitar lazy-ir a buscar completamente
Mientras esto funciona, el rendimiento de la aplicación ha sufrido mucho (a veces casi inutilizable). La desaceleración es causada principalmente por la gran cantidad de objetos que cada consulta busca ahora.
Actualmente estoy pensando en cambiar el diseño de la aplicación a 'Sesión por hilo' y migrar todas las entidades recuperadas por hilos no EDT a la Sesión del hilo EDT (similar a this posting on the Hibernate forums).
Nota al margen: no se aplican los problemas relacionados con las actualizaciones de la base de datos, ya que todas las entidades de la base de datos son de solo lectura (datos de referencia).
¿Alguna otra idea sobre cómo utilizar Hibernate con lazy-loading en este escenario?
Quizás no entendí correctamente su respuesta (el inglés no es mi primer idioma) pero esto no desencadenaría una excepción LazyInitException cuando el modelo de vista (= EDT) intenta obtener datos de forma perezosa (¡ya que EDT! = ' hilo de datos)? De todos modos, su sugerencia funcionaría para mi aplicación si el análisis de la respuesta del servidor se llevara a cabo en el EDT y no por otro hilo como se está haciendo actualmente ... hmmmm ... Tengo que pensar en esto;) Gracias para tomarte tu tiempo! – JavaGuy
Su respuesta supone que tiene una sola sesión en el hilo de datos que no cierra. Sin embargo, esto adolece del problema de la memoria caché L1 en constante crecimiento a menos que sea muy exigente con la separación de elementos de la sesión cuando ya no los necesite. – Jherico
Soy consciente del problema de la "creciente sesión", pero actualmente esto está actualmente muy ponderado por el problema de la "recuperación de lazy perezoso";) ¿No necesitaría todavía dos sesiones para esto (uno para el hilo de datos, uno para el EDT) para que funcione la recolección diferida dentro de la vista? – JavaGuy