Estoy luchando para entender cómo funciona el generador de HiLo en NHibernate. He leído la explicación here que aclara un poco las cosas.Explicación de NHibernate HiLo
Mi comprensión es que cada SessionFactory recupera el alto valor de la base de datos. Esto mejora el rendimiento porque tenemos acceso a los ID sin tocar la base de datos.
La explicación desde el enlace anterior también señala:
Por ejemplo, suponiendo que tiene una secuencia de "alta" con un valor actual de 35, y el número "bajo" está en el rango 0-1023 . Luego el cliente puede incrementar la secuencia a 36 (para que otros clientes puedan generar claves mientras usa 35) y saber que las claves 35/0, 35/1, 35/2, 35/3 ... 35/1023 son todo disponible.
¿Cómo funciona esto en una aplicación web? No solo tengo una SessionFactory y por lo tanto un valor de hi. ¿Esto significa que en una aplicación desconectada puede terminar con identificadores duplicados (bajos) en su tabla de entidades?
En mis pruebas he usado estos ajustes:
<id name="Id" unsaved-value="0">
<generator class="hilo"/>
</id>
me hizo una prueba para ahorrar 100 objetos. Los ID de mi tabla pasaron de 32768 a 32868. El siguiente valor de alta se incrementó a 2. Luego volví a ejecutar mi prueba y los ID estaban en el rango 65536 - 65636.
En primer lugar, ¿por qué comenzar en 32768 y no? 1, y en segundo lugar, ¿por qué el salto de 32868 a 65536?
Ahora sé que mis claves sustitutivas no deberían tener ningún significado, pero sí las usamos en nuestra aplicación. ¿Por qué no puedo hacer que se incrementen muy bien como lo haría un campo de identidad de SQL Server?
Finalmente, ¿alguien me puede dar una explicación de cómo funciona el parámetro max_lo? ¿Es este el número máximo de valores bajos (identificaciones de entidades en mi cabeza) que se pueden crear contra el valor alto?
Este es un tema en NHibernate que he tenido problemas para encontrar documentación. Leí todo el libro NHibernate en acción y todavía no se explica cómo funciona esto en detalle.
Gracias Ben
gracias por la explicación. –
el valor predeterminado de max_lo es java short.MAX_VALUE == 2^15-1 = 32767 – kommradHomer