0

问题:我们正在使用大量条目查询我们的数据库。整体应用性能还可以。但我认为如果我们的瓶颈,查询一个特殊的表,可以并行完成会更好。

我们用于动态查找器,例如:

Object.findAllByObjectCollectionAndParentIsNullAndDeletedByUserIsNull(objectCollection, [sort: 'attr1.number', fetch: [objectType: 'eager']])

我想到了这个解决方案:将查询分为 2 个步骤。

  1. 第一步仅以排序方式加载 Id。
  2. 第二步(可以在并行线程中完成)通过 id 加载对象本身并将其插入结果集中。

我已经用谷歌搜索了一些关于此的提示,但一无所获。

  1. 有没有可能,这没有意义?
  2. 还是在 grails 标准/扩展中已经有足够的解决方案?
  3. 如果它有意义并且没有解决方案:有人可以给我一个实现它的提示吗?但是,我们需要以这种排序方式的 id,如示例中所述。

我们使用 grails 2.3.11, hibernate:3.6.10.13 和 jdk 1.7。

4

1 回答 1

0

我找到了解决办法!

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 倍!

我认为原因是,

  1. 我们也必须创建线程和数据库连接。
  2. 加载对象后,需要将它们合并到我们的本地线程中。

但最后 - 我们不能使用它,因为延迟加载的字段不能在以后按需加载。所以这可能只是只读对象的解决方案

于 2015-04-30T09:04:06.083 回答