2016-12-26 78 views
0

在請求處理期間,我需要加載很多實體(兩種)。也許4或5千。其中大部分是從二級緩存中提供的。問題是依賴注入應用於每個域類的查殺應用程序的性能。Grails性能問題

探查示出瓶頸是org.codehaus.groovy.grails.plugins.web.api.ControllersDomainBindingApi.autowire它調用GrailsMetaClassUtils.invokeMethodIfExists

我試圖從控制器和從服務類加載的實體。結果是一樣的。

是否可以禁用這個不必要的DI功能的特殊情況下或類?

我的Grails版本是2.3.11

的Java 1.8

+0

?也許可以設計出性能良好的查詢? –

回答

0

您是否嘗試過使用顯式延遲加載或批量抓取?您可以在official docs上查看示例和更多解釋。

順便說一句,通常是更好的存儲器來存儲這樣一個大組的ID並加載它們一個接一個處理它們時(以避免其可以獲取對象和處理它們之間出現的可能的不一致性)

+0

是的,我使用延遲批量抓取並使用_Entity.load(id)_一個接一個地加載它們。問題是Hibernate以反序列化的形式將實體存儲在緩存中,因此每次緩存檢索都需要實體對象實例化。並且每個實例都執行自動裝配,消耗大量的CPU。 – viator

0

您可以通過以下配置的Grails的較新版本中grails-app/conf/runtime.groovy禁用依賴注入(Grails的3)或grails-app/conf/Config.groovy(使用GORM Grails的5/6 2):你需要做的所有這些實體有什麼

grails.gorm.default.mapping = { 
    autowire false 
} 
+0

我正在挖掘元類修改,但無法使其工作。我的構造函數只是跳過了。你能給出一個適當的方式來做到這一點?謝謝! – viator