Tengo una gran cantidad de filas en la base de datos desde la cual necesito crear un documento XML. Estoy usando hibernate 3. El método de la lista básica() en Criteria y las interfaces de consulta parece peligroso: lo que más me preocupa es que lea todos los registros en la memoria, incluso si solo iterar sobre ellos. ¿O hay alguna magia de carga floja? Si no, parece que me quedan dos opciones: usar scroll() o iterate() desde Query (scroll también está presente en Criteria). iterar no se ve muy bien si quiero tener un mínimo de ida y vuelta SQL: "La primera consulta SQL solo devuelve identificadores". Así que estoy en lo cierto, ¿tengo que usar scroll() para esto?Hibernar: evitar leer todos los registros en la memoria de una vez
Respuesta
Use el método setMaxResults() en Criteria.
Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(maxResults);
crit.setFirstResult(firstResultIndex);
List cats = crit.list();
http://hibernate.org/hib_docs/v3/reference/en/html/querycriteria.html
http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Criteria.html
Lo que quiero hacer es tener todos los resultados en forma transaccional. Entiendo que quieres decir que debería construir todo el gran conjunto de resultados de partes. ¿Puedo usar estos para "unir" mis conjuntos de resultados consistentes y grandes para que realmente obtenga una instantánea desde un cierto punto de tiempo. – auramo
No estoy seguro de lo que quiere decir con "tener todos los resultados de forma transaccional". –
Lo que quiero decir es que mi conjunto de resultados es una instantánea, ninguna escritura/eliminación que ocurra entre otros clientes afectará eso. – auramo
También, echar un vistazo a la recuperación en lotes Sección 19.1.4 y 19.1.5 debe hacer. http://www.hibernate.org/hib_docs/v3/reference/en-US/html_single/#queryhql-joins-forms
¿Sabe si esas consultas por lotes (por ejemplo, 10, 10 y 5 gatos en el ejemplo) terminan todas en la lista (si consulto la tabla con list() en la memoria mientras la recorro? O puede hibernar la descarga primer lote cuando procedo al siguiente lote (por ejemplo, los próximos 10 gatos después de los primeros 10 gatos). – auramo
Esto es lo que estoy pensando en hacer: Crear una tabla temporal con los ID de objetos de todas las filas que necesito para exportar:
Insert into BatchTable (ID, Seq) Select (O.ID, Sequence.Next)
From MyObject O Where ...
En pequeñas unidades de carga de trabajo en los objetos :
Select Min(B.Seq), Max(B.Seq) From BatchTable;
for (batch = minBatch; batch <= maxBatch; batch += size) {
beginTransaction();
results = query("Select O From MyObject O, BatchTable B
Where O.ID = B.ID and (? <= B.Seq AND B.Seq < ?)");
exportXML(results);
for (MyObject O : results) {
O.setProcessed(True);
O.update();
}
commit();
}
Si no es necesario marcar los objetos fuera como procesed, sólo tiene que utilizar de desplazamiento() y desalojar a los objetos de la sesión como haya terminado con ellos.
Try usando desplazamiento(), en relación con esto:
http://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/StatelessSession.html
A API orientada comando-para realizar operaciones a granel contra una base de datos.
Una sesión sin estado no implementa una memoria caché de primer nivel ni interactúa con ninguna memoria caché de segundo nivel, ni implementa escritura transaccional retrasada o comprobación sucia automática, ni las operaciones se conectan en cascada a las instancias asociadas. Las colecciones son ignoradas por una sesión sin estado. Las operaciones realizadas a través de una sesión sin estado omiten el modelo de eventos e interceptores de Hibernate. Las sesiones sin estado son vulnerables a los efectos de alias de datos, debido a la falta de un caché de primer nivel.
Para ciertos tipos de transacciones, una sesión sin estado puede funcionar un poco más rápido que una sesión con estado.
- 1. Cómo evitar el error OOM (Memoria insuficiente) al recuperar todos los registros de la tabla grande?
- 2. ¿Puedo ejecutar las pruebas JUnit automáticamente una vez con todos los registros activados y una vez con todos los registros deshabilitados?
- 3. Borrar todos los registros de una tienda
- 4. Cómo forzar a hibernar a liberar memoria una vez que se cierra la sesión?
- 5. Búsqueda de sol de manchas solares, ¿cómo devolver todos los registros a la vez?
- 6. ¿Cómo leo el valor de todos los registros con gdb?
- 7. ¿Cómo puedo eliminar todos los registros de un TClientDataset a la vez?
- 8. Eliminar todos los registros en NSManagedObjectContext
- 9. Hadoop leer varias líneas a la vez
- 10. Recuperar todos los registros en una tabla con nHibernate
- 11. Campo de downcase masivo para todos los registros en rieles
- 12. Doctrine 2 - Obtener todos los registros
- 13. ¿Los archivos .dll se cargan una vez para cada programa o una vez para todos los programas?
- 14. Encontrar todos los registros sin asociados
- 15. hibernar insertar en una colección provoca una eliminación luego todos los elementos en la colección que se insertará de nuevo
- 16. Eliminando todos los manejadores de eventos de una vez
- 17. evitar especificar todos los argumentos en una subclase
- 18. seleccionar todos los registros creados dentro de la hora
- 19. SQL con Limit1 devuelve todos los registros
- 20. Comprobación de todos los valores de matriz a la vez
- 21. Rieles: elimine todos los registros que cumplan una condición
- 22. Una manera de evitar perder memoria
- 23. En el shell de Erlang, ¿Cómo puedo leer automáticamente todos mis encabezados de registros de definición
- 24. Rieles: ¿Cómo encuentro() todos los registros únicos en ciertos campos?
- 25. ¿Cómo eliminar todos los alias de git a la vez?
- 26. Leer una cadena, caracteres de 3x3 a la vez
- 27. Valor de configuración para una columna de todos los registros en la tabla
- 28. Escribir una vez, leer muchos campo mysql
- 29. Hacer todos los controles en un formulario de solo lectura de una vez
- 30. Hibernar y cómo evitar el cambio de nombre de modales
Esto también se aplicó a NHibernate :) –