异常在使用JDBC连接中插入记录到Apache Ignite群集



我一直在努力使用JDBC连接在Apache Ignite Cache上运行插入查询。我使用以下配置创建了缓存:

CacheConfiguration<Long, MyApplication> cacheCfg = new CacheConfiguration<>("SQL_PUBLIC_MYAPPLICATION");
cacheCfg.setCacheMode(CacheMode.REPLICATED);
cacheCfg.setIndexedTypes(Long.class, MyApplication.class);
cacheCfg.setSqlSchema("PUBLIC");
cacheCfg.setCacheStoreFactory(FactoryBuilder.factoryOf(CacheMyApplicationStore.class));
cacheCfg.setReadThrough(true);
cacheCfg.setWriteThrough(true);
FifoEvictionPolicy<Long, MyApplication> eviction = new FifoEvictionPolicy<Long, MyApplication>();
eviction.setMaxSize(100_000);
IgniteCache<Long, MyApplication> cache = getIgnite().getOrCreateCache(cacheCfg);
cache.loadCache(null, 100_000);

myApplication.java

public class MyApplication {
    @QuerySqlField(index = true,orderedGroups = {@QuerySqlField.Group(name = "idx3", order = 0)})
    private Long ID;
    @QuerySqlField(index = true,orderedGroups = {@QuerySqlField.Group(name = "idx3", order = 1)})
    private String NAME;
    @QuerySqlField
    private String DESCRIPTION;
}

我能够使用JDBC连接更新或删除缓存中的记录,但插入不起作用。当我尝试使用以下代码插入时,我会得到一个例外:

Connection conn = DriverManager.getConnection("jdbc:ignite:thin://url:4000");
try (PreparedStatement stmt = conn.prepareStatement("insert into MyApplication (ID, NAME, DESCRIPTION) values (1, 'TestApp', 'To be deleted')")) {
    stmt.setLong(1, 1L);
    stmt.setString(2, "TestApp");
    stmt.setString(3, "To be deleted");
    stmt.executeUpdate();
}

例外:

[17:15:14,894][ERROR][sql-connector-#58%agrid%][JdbcRequestHandler] Failed to execute SQL query [reqId=1, req=JdbcQueryExecuteRequest [schemaName=null, pageS ize=1024, maxRows=0, sqlQry=insert into MyApplication (ID, NAME, DESCRIPTION) values (?,?,?), args=[1, TestApp, To be deleted]]] class org.apache.ignite.internal.processors.query.IgniteSQLException: Failed to execute DML statement [stmt=insert into MyApplication (ID, NAME, DESCRIPTION) values (?,?,?), params=[1, TestApp, To be deleted]]]
        at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.queryDistributedSqlFields(IgniteH2Indexing.java:1324)
        at org.apache.ignite.internal.processors.query.GridQueryProcessor$6.applyx(GridQueryProcessor.java:1856)
        at org.apache.ignite.internal.processors.query.GridQueryProcessor$6.applyx(GridQueryProcessor.java:1852)
        at org.apache.ignite.internal.util.lang.IgniteOutClosureX.apply(IgniteOutClosureX.java:36)
        at org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuery(GridQueryProcessor.java:2293)
        at org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFieldsNoCache(GridQueryProcessor.java:1860)
        at org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequestHandler.executeQuery(JdbcRequestHandler.java:188)
        at org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequestHandler.handle(JdbcRequestHandler.java:122)
        at org.apache.ignite.internal.processors.odbc.SqlListenerNioListener.onMessage(SqlListenerNioListener.java:152)
        at org.apache.ignite.internal.processors.odbc.SqlListenerNioListener.onMessage(SqlListenerNioListener.java:44)
        at org.apache.ignite.internal.util.nio.GridNioFilterChain$TailFilter.onMessageReceived(GridNioFilterChain.java:279)
        at org.apache.ignite.internal.util.nio.GridNioFilterAdapter.proceedMessageReceived(GridNioFilterAdapter.java:109)
        at org.apache.ignite.internal.util.nio.GridNioAsyncNotifyFilter$3.body(GridNioAsyncNotifyFilter.java:97)
        at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:110)
        at org.apache.ignite.internal.util.worker.GridWorkerPool$1.run(GridWorkerPool.java:70)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Caused by: class org.apache.ignite.IgniteCheckedException: Key is missing from query
        at org.apache.ignite.internal.processors.query.h2.dml.UpdatePlanBuilder.createSupplier(UpdatePlanBuilder.java:331)
        at org.apache.ignite.internal.processors.query.h2.dml.UpdatePlanBuilder.planForInsert(UpdatePlanBuilder.java:196)
        at org.apache.ignite.internal.processors.query.h2.dml.UpdatePlanBuilder.planForStatement(UpdatePlanBuilder.java:82)
        at org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.getPlanForStatement(DmlStatementsProcessor.java:438)
        at org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.updateSqlFields(DmlStatementsProcessor.java:164)
        at org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.updateSqlFieldsDistributed(DmlStatementsProcessor.java:222)
        at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.queryDistributedSqlFields(IgniteH2Indexing.java:1321)
        ... 17 more

任何帮助将不胜感激。

只需使用创建表和创建索引命令配置缓存和SQL索引,尤其是如果您计划使用SQL Operations IGNINE访问IGNINE。

仍然需要键值,计算或机器学习API,请检查此项目,该项目在使用SQL DDL命令定义缓存时显示了如何执行此操作。

根本原因是:

Caused by: class org.apache.ignite.IgniteCheckedException: Key is missing from query

您在INSERT语句中提供的所有值属于Value对象,因此IGNITE无法为条目创建关键对象,并抛出此异常。

要解决此问题,您应该为关键对象(例如MyApplicationKey)创建一个类,然后将ID字段移动到那里。

最新更新