使用动态查找器的并行查询Grails设计模式
问题: 我们正在用大量条目查询数据库。整体应用程序性能正常。但我认为如果我们的瓶颈,即查询一个特殊的表,可以并行进行的话会更好 我们使用的动态查找器如下:使用动态查找器的并行查询Grails设计模式,grails,design-patterns,parallel-processing,dynamic-finders,Grails,Design Patterns,Parallel Processing,Dynamic Finders,问题: 我们正在用大量条目查询数据库。整体应用程序性能正常。但我认为如果我们的瓶颈,即查询一个特殊的表,可以并行进行的话会更好 我们使用的动态查找器如下: Object.findAllByObjectCollectionAndParentIsNullAndDeletedByUserIsNull(objectCollection, [sort: 'attr1.number', fetch: [objectType: 'eager']]) 我考虑这个解决方案:将查询分为两个步骤 第一步仅以排序方式
Object.findAllByObjectCollectionAndParentIsNullAndDeletedByUserIsNull(objectCollection, [sort: 'attr1.number', fetch: [objectType: 'eager']])
我考虑这个解决方案:将查询分为两个步骤
第一步仅以排序方式加载ID。
第二步可以在并行线程中完成,通过id加载对象本身并将其插入结果集。
我已经在谷歌上搜索了一些关于这方面的提示,但什么也没找到
有没有可能,这毫无意义?
或者在grails标准/扩展中已经有足够的解决方案了吗?
如果这是有意义的,并且没有解决方案:有人能给我一个实现它的提示吗?但是,我们需要以这种排序方式使用ID,如示例中所述。
我们使用的是Grails2.3.11,hibernate:3.6.10.13,下面是JDK1.7。我找到了一个解决方案
ArrayList<Long> objectIds = Attribute.executeQuery("select o.id from Object o, ObjectType ot where o.objectCollection = :oc and o.parent is null and o.deletedByUser is null and oc.typeUsage = ot order by ot.nr asc", [oc: objectCollection])
Object[] tmp = new Object[objectIds.size()]
withPool(10, {
objectIds.eachWithIndexParallel {
Long objectId, i ->
Object o = Object.findById(objectId, [cache: true])
tmp[i] = a
}
})
for (Object a : tmp)
a.merge()
它的速度大约慢3倍
我想原因是,
我们还必须创建线程和数据库连接。
加载对象后,需要将它们合并到本地线程中。
但最终,我们不能使用它,因为延迟加载的字段不能在以后按需加载。因此,这可能是只读对象的唯一解决方案您是否在此处记录了findAll查询的SQL并尝试分析它的功能?是否有父项和已删除项的索引?否则,只有一种方法可以了解类似的情况:尝试并对其进行基准测试。当谈到性能时,对于所有的情况来说,通常都没有什么灵丹妙药。是的,当然。我们加载的这些对象包含非常小的数据元素,比如excel工作表的单元格。因此,当页面呈现时,我们需要很多。