Pregunta

Tenemos 2 java aplicaciones web tanto son de lectura / escritura y 3 java independiente de lectura / aplicaciones de grabación (una carga preguntas vía e-mail, uno procesos una fuente XML, uno envía correo electrónico a los suscriptores) todo el uso de hibernación y compartir una base de código común .

El problema que recientemente hemos encontrado es que las preguntas cargadas a través de correo electrónico a veces de sobreescritura preguntas creadas en una de las aplicaciones web. Tenga en cuenta, estas son cuestiones separadas que deben tener identificadores separados. Originalmente pensamos que se trata de un problema de almacenamiento en caché. Hemos tratado de apagar el caché de segundo nivel, pero esto no hace una diferencia.

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.cache.use_second_level_cache">false</property>

Pregunta:

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
@DocumentId
public Integer getId() {
    return this.id;
}

Estamos utilizando MySQL por cierto.

CREATE TABLE  `question` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (`id`),
  ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8

No se están abriendo y cerrando de forma explícita las sesiones, sino más bien dejar que ellos se las arreglan a través de hibernación Util.getSessionFactory().getCurrentSession().

preferimos no configurar una caché de segundo nivel agrupados en esta etapa ya que esto crea otro nivel de complejidad y estamos más que satisfechos con el nivel de rendimiento que obtenemos de la aplicación en su conjunto.

Lo mismo sucede con la implementación de una sesión-en-vista abierta patrón en las aplicaciones web y gestionar manualmente las sesiones en la versión autónoma de aplicaciones de sonido que iba a solucionar este problema?

o alguna sugerencia / favor ideas?

¿Fue útil?

Solución 2

Resulta que este problema no estaba relacionado con Hibernate en absoluto.

Una de las tablas de bases de datos en el servidor de ensayo se llenó de datos antiguos que deberían haber sido limpiado. Este principio dio la apariencia de Identificación de ser sobrescritos, pero una mayor investigación demostró lo contrario!

Una vez que hemos eliminado los datos poco fiables, todo estaba bien.

Otros consejos

Dado que todas las preguntas tienen ID, entonces asumir que todas las preguntas se obtienen de la base de datos MySQL.

Si se asume que no es necesario para almacenar las preguntas como objetos transparentes en la memoria, sino que selecciona todas las preguntas para cada vez que se les presente, tengo una simple sugerencia.

Reemplazar el generador de ID con una secuencia en la base de datos. (Eventualmente, el ID como autonumber en MySQL). A continuación, la base de datos en lugar de las aplicaciones garantiza que todas las preguntas consigue un identificador único.

Esta solución es bastante sencilla y reduce su complejidad. Y sólo funciona si persisten todas las preguntas entrantes de las diferentes fuentes en su base de datos y luego seleccionar desde aquí.

Si esta solución le da problemas de rendimiento, se debe investigar más sobre cómo su trabajo generador de Identificación de hibernación. Hibernate ofrece varios generadores diferentes para diferentes escenarios.

Espero que esto ayuda!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top