Массовое чтение данных в спящем режиме с использованием прокручиваемого набора результатов.
Я читал блог о массовой загрузке с помощью hibernate http://java.dzone.com/articles/bulk-fetching-hibernate.
В этом, ScrollableResults
используется в качестве решения. Здесь еще нужно выселить объекты из сессии.
Я не понимаю, как с помощью ScrollableResults
(или же scroll()
) отличается от использования list()
,
Другими словами, как нижеприведенные утверждения отличаются с точки зрения производительности
List<Employee> empList = session.createCriteria(Employee.class).list();
ScrollableResults sc = session.createCriteria(Employee.class).scroll();
Пожалуйста, дайте мне знать.
2 ответа
В приведенном выше коде, похоже, отсутствуют некоторые настройки.
Query query = session.createQuery(query);
query.setReadOnly(true);
// MIN_VALUE gives hint to JDBC driver to stream results
query.setFetchSize(Integer.MIN_VALUE);
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
// iterate over results
while (results.next()) {
Object row = results.get();
// process row then release reference
// you may need to flush() as well
}
results.close();
Перейдите по этой ссылке для более подробной информации и объяснения.
Я обратился к документации по Hibernate API, чтобы понять разницу между list() и scroll(). ScrollableResults похож на курсор. Важной особенностью ScrollableResults является то, что он позволяет получить доступ к i-му объекту в текущей строке результатов, не инициализируя другие результаты в строке с помощью функции get(int i). Это также позволяет перемещаться назад и вперед в наборе результатов, используя функции next() и previous().
Пример:
ScrollableResults sc = session.createQuery("select e.employeeName,e.employeeDept FROM Employee e").scroll(ScrollMode.SCROLL_INSENSITIVE);
while(sc.next()) {
String empName = (String)sc.get(0);
System.out.println(empName);
String empdept = (String)sc.get(1);
System.out.println(empdept);
}
Выходные данные вышеупомянутой программы будут значения employeeName и employeeDept .
Теперь предположим, что вы хотите получить последнюю запись результирующего набора. С list() вам нужно будет повторить весь результат. С ScrollableResults вы можете использовать last()
функция.
Обратите внимание, что для ScrollableResults sc = session.createCriteria(Employee.class).scroll();
должен быть повторен как
while(sc.next()) {
Employee emp = (Employee)sc.get(0);
System.out.println(emp.getname);
}