我目前正在研究一个数据导入处理程序,它从MySQL检索数据以进行快速搜索。它包括根实体CabinCategoryFares和一些子实体(CruiseRouteDayShip)的导入。
此导入工作正常,但速度非常慢,因为CabinCategoryFaresCruise之间的关系是多对一的,因此有许多关于Cruise的相同查询被触发。
为了缓解这种情况,我尝试在子实体上实现SortedMapBackedCache缓存。下面一个片段,原来是相当大的。

<document name="Cruises">
  <entity name="CabinCategoryFare" transformer="RegexTransformer" query="SELECT CabinCategoryFare.cruise_id FROM CabinCategoryFare">
    <entity name="Cruise"  cacheImpl="SortedMapBackedCache" cacheKey="Cruise.id" cacheLookup="CabinCategoryFare.cruise_id"query="SELECT Cruise.id FROM Cruise">
    </entity>
  </entity>`

对于从NULL读取的每个字段,这将返回Cruise。我可以从日志中看出dataimporthandler正在运行Cruise查询,但它只是没有返回任何结果或之后的任何错误。它似乎无法在cacheLookup上找到任何点击,但是登录DIHCacheSupport类是不存在的,我完全失去了正在发生的事情,或者更确切地说为什么它没有发生。
有什么想法吗?

最佳答案

发现问题:
一。Solr/DIHCacheSupport.java中的错误:https://stackoverflow.com/a/21732907/3012497
(cacheKey在进程中的某个地方大写,cacheLookup不大写,因此需要始终使用大写的cacheLookup)
2。对Cruise实体的查询使用了一个分组函数(GROUP CONCAT),但没有GROUP BY子句。这不是一个未缓存的问题(因为WHERE子句),但仍然只返回一行而不返回WHERE。
三。DIHCacheSupport似乎只适用于字符串键,int键将导致日志中不显示的异常。
希望这能节省一些时间。

07-26 03:46