ApacheIgnite.NET2.8.1:与QueryEntity的亲和性搭配
我正在Windows10机器上使用ApacheIgniteV.2.8.1.Net 我正在尝试在启用查询的缓存上使用关联搭配。我存储在缓存中的实体有一个名为Id的主键和一个名为PartnerId的关联键。两个键的类型均为Int32。我将缓存定义如下:ApacheIgnite.NET2.8.1:与QueryEntity的亲和性搭配,ignite,Ignite,我正在Windows10机器上使用ApacheIgniteV.2.8.1.Net 我正在尝试在启用查询的缓存上使用关联搭配。我存储在缓存中的实体有一个名为Id的主键和一个名为PartnerId的关联键。两个键的类型均为Int32。我将缓存定义如下: new CacheConfiguration("BespokeCharge") { KeyConfiguration = new[] {
new CacheConfiguration("BespokeCharge")
{
KeyConfiguration = new[]
{
new CacheKeyConfiguration()
{
AffinityKeyFieldName = "PartnerId",
TypeName = typeof(BespokeCharge).Name
}
}
};
接下来,我使用以下代码添加数据:
var cache = Ignite.GetCache<AffinityKey, BespokeCharge>("BespokeCharge")
cache.Put(new AffinityKey(entity.Id, entity.PartnerId), entity)
当我运行代码时,Ignite和我的应用程序都会崩溃,并记录以下错误:
JVM将由于以下故障立即停止:[failureCtx=FailureContext[type=CRITICAL_ERROR,err=class o.a.i.i.processors.cache.persistence.tree.CorruptedTreeException:B+树已损坏[pagesgroupId,pageId=[IgniteBitute[val1=1565129718,val2=844420635164729]],cacheId=-1278247946,cacheName=BESPOKECHARGES,indexName=BESPOKECHARGES\u ID\u ASC\u IDX,msg=行上的运行时故障:Row@29db2fbe[key:AffinityKey[idHash=8137191,hash=783909474,key=3,affKey=2],val:UtilityClick.BillValidation.Shared.InMemory.Model.BespokeCharge[idHash=889383506,hash=-399638125,BespokeChargeTypeId=4,ChargeValue=100.0000,ChargeValueInCommission=100.0000,Id=3,PartnerId=2,QuoteRecordId=5][4100.0000,100.0000,2,5]]
当我试图用int键类型而不是AffinityKey来定义QueryEntity时,我得到了一个不同的错误,结果是相同的——崩溃
JVM将由于以下故障而立即停止:[failureCtx=FailureContext[type=CRITICAL_ERROR,err=java.lang.ClassCastException:class o.a.i.cache.affinity.AffinityKey无法强制转换为class java.lang.Integer o.a.i.cache.affinity.AffinityKey位于加载器“app”的未命名模块中;java.lang.Integer位于加载器“bootstrap”的java.base模块中]]
我做错了什么?感谢您的帮助!KeyFieldName=Id设置是个问题。它将Id字段设置为用作缓存键,即int,但随后我们将AffinityKey用作缓存键,这会导致类型不匹配
在这种情况下,我认为我们根本不需要KeyFieldName,删除它可以解决问题,选择查询不应受到此更改的影响。您可以尝试使用typeofT.FullName而不是typeofT.Name吗?@PavelTupitsyn谢谢,可以。t是BespokeCharge抱歉,我忘了用真正的实体类型替换t以进行Clarify让我知道它是怎么回事。如果有一个复制程序就太好了-Ignite中肯定有一些bug-它不应该仅仅因为配置错误而使JVM崩溃。@PavelTupitsyn我得到了与上面相同的错误,B+树已损坏。@PavelTupitsyn我将尝试创建一个复制程序项目。谢谢,我会尝试。SQL引擎如何知道Id字段是f的键如果我没有明确地指定它?是否有某种约定来考虑EF中的名称ID关键字字段的所有字段?再次感谢,这解决了问题。但是另一个问题出现了:用键和亲和密钥构造LINQ/SQL查询的正确方法是什么?它是正确的LINQ查询吗?query=cache.AsCacheQueryable;var result=query.Wherem=>m.Value.Id==1&&m.Value.PartnerId==1.FirstOrDefault?.Value;@AlexAvrutin只需按原样使用键:cache.Querynew SqlFieldsQueryselect*from BespokeCharge,其中(键=?),new AffinityKeyid,PartnerId或withLINQ var key=new AffinityKeybespokeCharge.Id,bespokeCharge.PartnerId;var qry=cache.AsCacheQueryable.Wherep=>p.key==key;@AlexAvrutin如果缓存键出现在上面的where子句中,Ignite会帮你找到它。或者你是说别的什么?你可以在实体中去掉Id和PartnerId,因为它们出现在ke中y,但在本例中,您必须使用自定义键类而不是预定义的AffinityKey,以便Id和PartnerId标记为[QuerySqlField],并在SQL中可用。
new CacheConfiguration("BespokeCharge",
new QueryEntity(typeof(AffinityKey), typeof(BespokeCharge))
{
KeyFieldName = "Id",
TableName = "BespokeCharge"
})
{
KeyConfiguration = new[]
{
new CacheKeyConfiguration()
{
AffinityKeyFieldName = "PartnerId",
TypeName = typeof(BespokeCharge).Name
}
}
};