2016-07-18 17 views
0

Ich muss Daten aus Apache Ignite Cache ziehen und zeigen es auf JSP. Die Datengröße ist in Millionen, daher muss ich die Seitenumbrüche auf der Serverseite einrichten. Apache Ignite docs sagt nicht viel über Paginierung aus, außer dass pageSize für die Abfrage gesetzt wird, die standardmäßig 1024 ist. Wie übergebe ich startIndex und endIndex, im Grunde die Parameter, die wir übergeben, wenn wir die Paginierung mit Datenbank implementieren. Zum Beispiel habe ich unter Beispiel-Code zu Abfrage-Cache, können wir Paginierung anwenden, indem Sie bestimmte Parameter übergeben.Paginierung Feature in Apache Ignite

public Set<String> getData(int pageSize){ 
     Ignite ignite = Ignition.start("examples/config/example-ignite.xml"); 
     CacheConfiguration<Integer, String> config = new CacheConfiguration<>("mycache"); 
     config.setBackups(1); 
     IgniteCache<Integer, String> cache = ignite.getOrCreateCache(config); 
     long dataSize = 30; 
     for (int i = 1; i < dataSize; i++) { 
      cache.put(i, String.valueOf(i)); 
     } 

     ScanQuery<Integer, String> query = new ScanQuery<>((Integer e1, String e2) ->e1>10); 
     Set<String> res = cache.query(query.setPageSize(pageSize)).getAll().stream().map(Cache.Entry::getValue).collect(toSet()); 
     System.out.println(res); 
     return res; 
    } 

Dank

Antwort

0

Ignite bietet keine solche Unterstützung für Paginierung. Die Paginierung in Ignite ist nur ein Mechanismus, um zu verhindern, dass der gesamte Datensatz von den Serverknoten zum Client abgerufen wird. D. h., Während Sie die QueryCursor durchlaufen, ruft der Client Daten in Chunks ab. Die Größe jedes Blocks wird durch die Eigenschaft pageSize definiert.

Nachdem Sie das gesagt haben, können Sie Daten auf der JSP-Seite in Seiten anzeigen, aber sobald Sie zur nächsten Seite gegangen sind, können Sie QueryCursor nicht mehr verwenden, um zurückzugehen. Wenn jedoch nicht erwartet wird, dass die Ergebnismenge sehr groß ist, können Sie die Methode QueryCursor.getAll() aufrufen, um alle Zeilen abzurufen und die Seitennummerierung auf Anwendungsebene zu verwalten. Speichern Sie das Ergebnis in der Websitzung oder an einem anderen Ort.

+0

Danke für Ihre Antwort. Ich habe pageSize versucht, wie Sie oben im Code sehen können. Aber es funktioniert nicht. Ich setze pageSize auf 10, während keine Datensätze mit Prädikat 20 sind, bekomme ich immer noch 20 statt 10 Datensätze. Angenommen, das sollte funktionieren, Mein Ansatz war das Hinzufügen von pagesSize und die skip() -Methode, Paginierung erreicht werden kann. Eine Idee, warum alle Datensätze zurückgegeben werden, unabhängig davon, ob pageSize gesetzt ist oder nicht. ? – Surinder

0

Ignite bietet Paginierungsfunktionen, Sie können hin und her gehen, ich habe in Version 2.3 getestet. Ich habe Spring Boot benutzt. überprüfen Sie den Code unten

Ruhe req:

http://localhost:8086/test/getOne1?page=2&size=5&city=bgr

Controller:

@GetMapping("/getOne1") 
    public Test getOneTest(String city, Pageable pageable) { 

     return testService.getOneTest(city, pageable); 
    } 

Service:

Test getOneTest(String city, Pageable pageable); 

Dienst Impl:

@Override 
    public Test getOneTest(String city, Pageable pageable) { 

     //Test one = repo1.getById(0); 


     //List<Integer> subscribers = repo1.findAll(pageable); 

     List<Integer> subscribers = repo1.selectAll(city, pageable); 

     subscribers.forEach(x -> System.out.println("--"+ x)); 

     return repo1.findOne(12); 
    } 

Repo:

@RepositoryConfig(cacheName = "test") 
public interface TestRepo extends IgniteRepository<Test, Integer>{ 


    @Query("SELECT subscribers FROM test where city = ?") 
    List<Integer> selectAll(String city, Pageable pageable); 

}