Apache Ignite Linq over Sql 无法解析 java 类
Posted
技术标签:
【中文标题】Apache Ignite Linq over Sql 无法解析 java 类【英文标题】:Apache Ignite Linq over Sql Failed to resolve java class 【发布时间】:2021-11-22 09:36:12 【问题描述】:我正在对使用 sql api 创建的表执行 linq。
我创建了表格:
var cfg = new CacheClientConfiguration(
"PUBLIC",
new QueryEntity(typeof(object), typeof(object)))
SqlSchema = "PUBLIC",
CacheMode = CacheMode.Partitioned
;
var cache = cli.GetOrCreateCache<object, object>(cfg);
cache.Query(new SqlFieldsQuery(@"
CREATE TABLE IF NOT EXISTS Things
(
Id UUID,
Name VARCHAR,
EffectiveDate TIMESTAMP,
PRIMARY KEY(Id)
)
WITH ""TEMPLATE = PARTITIONED,
CACHE_NAME = consoleappserver.Thing,
VALUE_TYPE = consoleappserver.Thing""
")).GetAll();
我放了一些种子数据:
cache.Query(new SqlFieldsQuery(@"
INSERT INTO Things (Id, Name, EffectiveDate) VALUES (?,?,?)",
Guid.NewGuid(), "Test Name 1", DateTime.SpecifyKind(DateTime.Today, DateTimeKind.Utc))).GetAll();
cache.Query(new SqlFieldsQuery(@"
INSERT INTO Things (Id, Name, EffectiveDate) VALUES (?,?,?)",
Guid.NewGuid(), "Test Name 2", DateTime.SpecifyKind(DateTime.Today.AddDays(1), DateTimeKind.Utc))).GetAll();
cache.Query(new SqlFieldsQuery(@"
INSERT INTO Things (Id, Name, EffectiveDate) VALUES (?,?,?)",
Guid.NewGuid(), "Test Name 3", DateTime.SpecifyKind(DateTime.Today.AddDays(2), DateTimeKind.Utc))).GetAll();
这是我的 linq 查询:
var cache = cli.GetCache<Guid, Thing>("consoleappserver.Thing");
var things = cache.AsCacheQueryable();
var effectiveDate = DateTime.SpecifyKind(DateTime.Today, DateTimeKind.Utc);
things = things.Where(t => t.Value.EffectiveDate <= effectiveDate);
foreach (var kv in things)
Console.WriteLine("Things #0 '1'", kv.Value.Id, kv.Value.Name);
这是我用于映射的 C# 类:
public class Thing
[QuerySqlField(Name = "ID")]
public Guid Id get; set;
[QuerySqlField(Name = "NAME")]
public string Name get; set;
[QuerySqlField(Name = "EFFECTIVEDATE")]
public DateTime EffectiveDate get; set;
这是我尝试迭代 things 时遇到的错误:
Apache.Ignite.Core.Client.IgniteClientException: '无法解析 .NET [platformId=1, typeId=298456301] 中的 Java 类'consoleappserver.Thing'。'
这是记录的完整错误:
[11:00:18,731][SEVERE][client-connector-#110][ClientListenerNioListener] 无法处理客户端请求 [req=o.a.i.i.processors.platform.client.binary.ClientBinaryTypeNameGetRequest@250d2f65] org.apache.ignite.IgniteException 类:无法在 .NET [platformId=1,typeId=298456301] 中解析 Java 类“consoleappserver.Thing”。 在 org.apache.ignite.internal.processors.platform.client.binary.ClientBinaryTypeNameGetRequest.process(ClientBinaryTypeNameGetRequest.java:57) 在 org.apache.ignite.internal.processors.platform.client.ClientRequestHandler.handle(ClientRequestHandler.java:93) 在 org.apache.ignite.internal.processors.odbc.ClientListenerNioListener.onMessage(ClientListenerNioListener.java:202) 在 org.apache.ignite.internal.processors.odbc.ClientListenerNioListener.onMessage(ClientListenerNioListener.java:58) 在 org.apache.ignite.internal.util.nio.GridNioFilterChain$TailFilter.onMessageReceived(GridNioFilterChain.java:278) 在 org.apache.ignite.internal.util.nio.GridNioFilterAdapter.proceedMessageReceived(GridNioFilterAdapter.java:108) 在 org.apache.ignite.internal.util.nio.GridNioAsyncNotifyFilter$3.body(GridNioAsyncNotifyFilter.java:135) 在 org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:119) 在 org.apache.ignite.internal.util.worker.GridWorkerPool$1.run(GridWorkerPool.java:69) 在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:834) 原因:java.lang.ClassNotFoundException:无法在 .NET [platformId=1,typeId=298456301] 中解析 Java 类“consoleappserver.Thing”。 在 org.apache.ignite.internal.MarshallerContextImpl.getClassName(MarshallerContextImpl.java:400) 在 org.apache.ignite.internal.MarshallerContextImpl.getClassName(MarshallerContextImpl.java:333) 在 org.apache.ignite.internal.processors.platform.client.binary.ClientBinaryTypeNameGetRequest.process(ClientBinaryTypeNameGetRequest.java:52) ... 11 更多
【问题讨论】:
您能否检查服务器节点日志并从那里附上完整的错误详细信息?日志应包含相同的异常消息“无法解析...”,但带有服务器端堆栈跟踪。 我已经添加了 如何将数据插入缓存?使用 SQL 还是来自 Java? 样本数据是用sql(api)插入的 感谢您提供更多详细信息,我可以重现它。您使用的是哪个 Ignite 版本? 【参考方案1】:由于表是使用 SQL 定义的,所以 Ignite 不知道 Thing
类型。在查询之前使用以下调用来强制二进制类型注册:
cli.GetBinary().GetBinaryType(typeof(Thing));
在Ignition.StartClient
之后,每个客户端实例可以执行一次此调用。
【讨论】:
为什么linq返回的数据没有设置主键字段? @herme0 键列被映射到缓存键,这将打印键:Console.WriteLine("Things #0 '1'", kv.Key, kv.Value.Name)
以上是关于Apache Ignite Linq over Sql 无法解析 java 类的主要内容,如果未能解决你的问题,请参考以下文章