使用值作为对象列表来点燃查询缓存

时间:2016-10-20 10:53:24

标签: ignite gridgain

我使用带有键的ignite缓存作为String,而值作为对象的集合(类似的类型)说List。

现在我想询问存储在缓存中的学生,让我们说5位得分最高的学生。

定义了如下配置

CacheConfiguration<String, List<Student>> cfg = new CacheConfiguration<String, List<Student>>("students");
ignite = Ignition.start("/usr/localc/ignite/examples/config/example-ignite.xml");
cfg.setIndexedTypes(String.class, List.class);

现在我解雇了像

这样的查询
SqlFieldsQuery qry = new SqlFieldsQuery("select count(*) from Person");

然后像

那样出现异常
Exception in thread "main" java.lang.AbstractMethodError: org.apache.ignite.internal.processors.query.h2.opt.GridH2Table$ScanIndex.getCost(Lorg/h2/engine/Session;[I[Lorg/h2/table/TableFilter;ILorg/h2/result/SortOrder;Ljava/util/HashSet;)D
at org.h2.table.TableFilter.getBestPlanItem(TableFilter.java:203)
at org.h2.table.Plan.calculateCost(Plan.java:123)
at org.h2.command.dml.Optimizer.testPlan(Optimizer.java:183)
at org.h2.command.dml.Optimizer.calculateBestPlan(Optimizer.java:79)
at org.h2.command.dml.Optimizer.optimize(Optimizer.java:242)
at org.h2.command.dml.Select.preparePlan(Select.java:1014)
at org.h2.command.dml.Select.prepare(Select.java:878)
at org.h2.command.Parser.prepareCommand(Parser.java:259)
at org.h2.engine.Session.prepareLocal(Session.java:560)
at org.h2.engine.Session.prepareCommand(Session.java:501)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1202)
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:73)
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:290)
at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.prepareStatement(IgniteH2Indexing.java:406)
at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.queryTwoStep(IgniteH2Indexing.java:1121)
at org.apache.ignite.internal.processors.query.GridQueryProcessor$2.applyx(GridQueryProcessor.java:732)
at org.apache.ignite.internal.processors.query.GridQueryProcessor$2.applyx(GridQueryProcessor.java:730)
at org.apache.ignite.internal.util.lang.IgniteOutClosureX.apply(IgniteOutClosureX.java:36)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuery(GridQueryProcessor.java:1666)
at org.apache.ignite.internal.processors.query.GridQueryProcessor.queryTwoStep(GridQueryProcessor.java:730)
at org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:700)
at com.tcs.enm.processor.Main.main(Main.java:47)

任何人都可以帮我查询???

2 个答案:

答案 0 :(得分:3)

要执行此类查询,您应将每个Student存储为单独的条目。 Student类应该包含定义字段和索引的所有注释,缓存配置应该如下所示:

cfg.setIndexedTypes(String.class, Student.class);

有关详细信息,请参阅此文档:https://apacheignite.readme.io/docs/sql-queries

答案 1 :(得分:1)

对于将来遇到此问题的任何人,此错误消息可能是由于使用了错误的H2版本。

http://apache-ignite-users.70518.x6.nabble.com/Exception-while-trying-to-access-cache-via-JDBC-API-td8648.html#a8651

如果您使用的是Ignite 1.7,则需要h2database 1.4.191。 请注意,h2database 1.4.192会在问题中提供异常,因为192中有一些更改,而Ignite未处理

我查看了我的软件包并将H2版本更改为1.4.191,这解决了我的问题。

相关问题