2016-11-30 132 views
1

我將大量數據保存在數據庫中,但它需要大量時間來保存3000行,所以我想每次保存數據時都要清除會話。我無法檢索會話對象。如何提高在grails中保存批量數據的性能?

錯誤:

Stacktrace follows: 
Message: Cannot invoke method getCurrentSession() on null object 

代碼:

def importUpload() { 
     def sessionFactory; 
     def session = sessionFactory.getCurrentSession() 
     User currentUser = springSecurityService.getCurrentUser(); 
     def file = request.getFile('file') 
     InputStream is =file.getInputStream() 
     XSSFWorkbook workbook = new XSSFWorkbook(is); 
     int sheet_Num = workbook.getNumberOfSheets(); 
     for (int sheetNo = 0; sheetNo < sheet_Num; sheetNo++) { 
      Sheet sheet = workbook.getSheetAt(sheetNo); 

       for (int row = 1; row < sheet.getLastRowNum(); row++) { 
       PrimaryOwner = sheet.getRow(row).getCell(1); 
       SecondaryOwner = sheet.getRow(row).getCell(2); 
       BusinessUnit = sheet.getRow(row).getCell(3); 
       ProfileTitle = sheet.getRow(row).getCell(5); 

       def job = Job.findByName(ProfileTitle); 
       if(!job){ 
        Job jobObj=new Job(); 

        jobObj.account = currentUser.account; 
        jobObj.contactName = PrimaryOwner; 
        jobObj.secondaryContactName = SecondaryOwner 
        jobObj.buisnessUnit = BusinessUnit 
        jobObj.name = ProfileTitle 
        job = jobObj.save(failOnError:true,flush:true); 
        session.flush() 
        session.clear() 
       } 
} 
+1

你應該注入你的'高清sessionFactory'在你的類,而不是在你的方法。 –

回答

2

這個博客看看:http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql

我跟着它的指導沖洗,並有良好的效果清除會話。我把它與一些批量保存結合起來。

事情是這樣的:

 
    SessionFactory sessionFactory //inject sessionFactory

void CreateBills(List<Statement> statements){ 
    statements.colate(100).each{List<Statement> batchedStatements -> 
     batchedStatements.each{Statement statement -> 
      new Bill(statement).save() 
     } 
     cleanupGorm() 
    } 
} 

void cleanupGorm(){ 
    def session = sessionFactory.currentSession 
    session.flush() 
    session.clear() 
    DomainClassGrailsPlugin.PROPERTY_INSTANCE_MAP.get().clear() 
}