Массовое чтение данных в спящем режиме с использованием прокручиваемого набора результатов.

Я читал блог о массовой загрузке с помощью 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);
 }
Другие вопросы по тегам