2012-12-14 36 views
0

我運行的Grails 1.3.7和使用的Grails數據庫遷移插件版本數據庫遷移1.0的Grails數據庫遷移插件 - Java堆空間

我的問題是,我有一個遷移變更集。這是從桌子上拉出斑點並將它們寫入磁盤。儘管我正在耗盡堆空間,但在運行此遷移時仍是如此。我想我需要刷新和清除會話以釋放一些空間,但是我無法從遷移中訪問會話。順便說一句很遷移的原因是我們從甲骨文存儲文件,並把它們放在盤

我試圖搬走

SessionFactoryUtils.getSession(sessionFactory, true) 

我也曾嘗試

SecurityRequestHolder.request.getSession(false) //request in null -> not surprising 

changeSet(author: "userone", id: "saveFilesToDisk-1") { 
    grailsChange{ 
     change{ 
      def fileIds = sql.rows("""SELECT id FROM erp_file""") 
      for (row in fileIds) { 
       def erpFile = ErpFile.get(row.id) 
       erpFile.writeToDisk() 
       session.flush() 
       session.clear() 
       propertyInstanceMap.get().clear() 
      } 
      ConfigurationHolder.config.erp.ErpFile.persistenceMode = previousMode 
     } 
    } 
} 

任何幫助將不勝感激。

回答

1

應用程序上下文將在您的遷移中自動提供爲ctx。你可以得到會話是這樣的:

def session = ctx.sessionFactory.currentSession 
+0

非常感謝。我回去仔細閱讀了遷移插件文檔。 我自己 davelt

0

要訪問會話,你可以使用withSession封這樣的:

Book.withSession { session -> 
    session.clear() 
} 

但是,這可能不是爲什麼你的應用程序運行的堆空間不足的原因。如果數據量很大,那麼

def fileIds = sql.rows("""SELECT id FROM erp_file""") 
    for (row in fileIds) { 
     .......... 
    } 

會佔用你的空間。嘗試使用分頁處理數據。不要一次加載所有數據。