我目前正在研究一个数据导入处理程序,它从MySQL检索数据以进行快速搜索。它包括根实体CabinCategoryFares
和一些子实体(Cruise
,RouteDay
,Ship
)的导入。
此导入工作正常,但速度非常慢,因为CabinCategoryFares
和Cruise
之间的关系是多对一的,因此有许多关于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键将导致日志中不显示的异常。
希望这能节省一些时间。