0

問題: 我們用很多條目查詢數據庫。整體應用程序性能還可以。但我認爲,如果我們的瓶頸,查詢一個特殊的桌子,可以做得更好。使用動態查找器進行並行查詢的Grails設計模式

我們正在使用該動態查找,如:

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

我認爲這個解決方案:將查詢到2個步驟。

  1. 第一步只以有序方式加載Ids。
  2. 第二步(可以在並行線程中完成)通過id加載對象本身並將其插入到結果集中。

我已經在Google上搜索了一些關於這方面的提示,但什麼都沒發現。

  1. 是否有可能,這是沒有意義的?
  2. 或者在grails標準/擴展中是否已經有適當的解決方案?
  3. 如果它是有道理的,並沒有解決方案:有人可以給我一個提示實施它嗎?但是,我們需要按照這種排序的方式進行編碼,在示例中進行了解釋。

我們使用的是grails 2.3.11,hibernate:3.6.10.13,下面有jdk 1.7。

+1

你記錄了你的findAll查詢的SQL,試圖分析它的功能嗎?父母是否有索引並被刪除?否則只有一種方法可以找出這樣的事情:試用它並進行基準測試。當談到表演的時候,那裏的所有案件往往沒有銀彈。 – cfrick

+0

當然可以。我們正在加載的這些對象持有非常小的數據元素,就像Excel工作表單元格一樣。所以當頁面呈現時,我們需要很多。 – Mirko

回答

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. 我們要創建線程,databaseconnections了。
  2. 加載對象後,需要將它們合併到本地線程中。

但最後 - 我們無法使用它,因爲懶惰的加載字段不能在以後按需加載。因此,這可能只是一個解決方案,只讀對象