Apache Ignite中的分页功能

时间:2016-07-18 06:27:18

标签: apache pagination ignite

我需要从Apache Ignite Cache中提取数据并在JSP上显示它。数据大小是百万,所以我需要设置服务器端分页。除了将pageSize设置为查询默认值为1024之外,Apache Ignite文档没有太多关于分页的说明。如何传递startIndex和endIndex,基本上是我们在实现数据库分页时传递的参数。 例如,我有以下示例代码来查询缓存,我们可以通过传递某些参数来对其进行分页。

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;
    }

由于

3 个答案:

答案 0 :(得分:0)

Ignite并没有为分页提供这样的支持。 Ignite中的分页只是一种避免从服务器节点获取整个数据集到客户端的机制。即,当您遍历QueryCursor时,客户端将以块的形式获取数据。每个块的大小由pageSize属性定义。

话虽如此,您可以在页面中的JSP页面上显示数据,但是一旦移动到下一页,您将无法使用QueryCursor返回。但是,如果预计结果集不会很大,则可以调用QueryCursor.getAll()方法获取所有行并处理应用程序级别的分页,将结果保存在Web会话或其他位置。

答案 1 :(得分:0)

Ignite提供分页功能,你可以来回走动,我已经在2.3版本中进行了测试。我用过Spring boot。检查以下代码

休息时间:

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

控制器:

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

        return testService.getOneTest(city, pageable);
    }

服务:

Test getOneTest(String city, Pageable pageable);

服务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);
    }

回购:

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


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

}

答案 2 :(得分:0)

使用“ limit m offset n”进行分页,如下所示:

SqlQuery querySql = new SqlQuery(UserInfo.class, "age > ? order by username desc limit ? offset ?");    
List<Cache.Entry<Integer, UserInfo>> resultList = userInfoCache.query(querySql.setArgs(20, 2, 5)).getAll();

当然,Ignite允许更改pageSize,但是您需要记住,Page size是用来设置光标的。结果集存储在内存的“页面”中,因此,如果U增加页面大小,则可以在同一页面中容纳更多数量的键值对。