Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用动态查找器的并行查询Grails设计模式_Grails_Design Patterns_Parallel Processing_Dynamic Finders - Fatal编程技术网

使用动态查找器的并行查询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工作表的单元格。因此,当页面呈现时,我们需要很多。