2016-11-30 2 views
1

Я экономя массивные данные в базе данных, однако для сохранения 3000 строк требуется много времени, поэтому я думал об очистке сеанса каждый раз, когда я сохраняю данные. Я не могу получить объект сеанса.Как повысить производительность экономии объемных данных в грабелях?

Ошибка:

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() 
} 

Смежные вопросы