Utilizando Hibernate 3.3.0 y ehcache 1.2.3 con caché de segundo nivel y caché de consultas activado, me di cuenta de que el siguiente código devolvía el mismo número de secuencia a varias llamadas, lo que ocasionó una falla en la inserción.¿Las consultas SQL nativas se almacenan en caché de forma predeterminada cuando la caché de consultas de Hibernate está activada?
HibernateCallback callback = new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException, SQLException {
StringBuilder strQuery = new StringBuilder();
strQuery.append("SELECT ");
strQuery.append(sequenceName);
strQuery.append(".nextval as nextSequence FROM dual d");
Query query = session.createSQLQuery(strQuery.toString()).addScalar("nextSequence", Hibernate.STRING);
return query.uniqueResult();
}
};
return this.hibernateTemplate.execute(callback).toString();
El código funciona correctamente si apago el caché de consultas o agrego la siguiente línea antes de ejecutar la consulta.
query.setCacheable(false);
Esto es confuso, ya que Hibernate documentos establecen claramente
mayoría de las consultas no se benefician de almacenamiento en caché, por lo que mediante consultas predeterminadas no son en caché. Para habilitar el almacenamiento en caché, llame al Query.setCacheable (true). Esta llamada permite que la consulta busque resultados de caché existentes o agregue sus resultados a la caché cuando se ejecuta.
En este caso, ¿es este comportamiento anormal y aún puedo asumir que las consultas no están en la memoria caché de forma predeterminada?
Información realmente útil sobre el caché de consultas aunque no puedo recordar por qué fue necesario en primer lugar. Sin embargo, el comportamiento de Hibernate como se describió anteriormente sigue siendo extraño. –