Grails 3: компонент SessionFactory не вводит в службу - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь массово добавить данные из файла, я прочитал метод с этого портала, чтобы массово добавить данные с помощью пакетной обработки

http://krixisolutions.com/bulk-insert-grails-gorm/

Когда я использовал эту технику и изменил свое приложение в соответствии с ней, мой код не работает, я работал в течение нескольких дней, чтобы найти способ массового сохранения данных, чтобы ускорить процесс, простая ручная очистка занимает 4 минуты чтобы сохранить 1000 строк данных в базе данных, я хочу сделать это время как можно меньше

В приведенном ниже коде всякий раз, когда я отлаживаю код, который он останавливает после SessionFactory, я не понимаю, в чем проблема, поскольку я очень новичок в grails и не имею никакого опыта с sessionFactory или транзакциями.

Вот мой код:

   runAsync {
            res = benchmark { result ->
                    Session session = SessionFactory.openSession()
Transaction tx = (Transaction)session.beginTransaction()




                    groovyFile.eachLine {


                        String[] tagData = it.split(',')

                        def isTimeToLive = true


                        if (isTimeToLive) {
                            try {
                                caller = new Caller(callingNumber: 
                       tagData.getAt(0), callerName: tagData.getAt(1))
                                session.save(caller)
                            } catch (Exception ex) {
                                log.error(ex.getMessage())
                            }

                            caller.validate()
                            if (caller.hasErrors()) {
                                println("message", "Invalid calling number. Digits can only be from 10 to 15.")
                            }

                            callCallerList = new CallCallerList(caller: caller, callerList: callerList)
                            callCallerList.validate()
                            if (callCallerList.hasErrors()) {
                                println("message", "Invalid calling number. Digits can only be from 10 to 15.")
                            } else {
                                session.save(callCallerList)
                            }

                        }
                        count++;
                        if (count % 100 == 0) {
                            session?.flush()
                            session?.clear()
                        }
                    }
                    tx.commit();
                    session.close();

                }


            }

        }

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

openSession не является статическим методом, вы должны ввести sessionFactory и открыть сеанс, если у вас его еще нет.

class SomeService {
  def sessionFactory
  void someMethod() {
    def session = sessionFactory.openSession() //or sessionFactory.currentSession, not sure how this works with async operations
    //all your stuff
    if(<threshold>) { 
       session.flush()
       session.clear() //helps performance on exceptionally large imports, probably not so much on ~1000 records
    }
  }
}
0 голосов
/ 05 ноября 2018

В Grails вы можете просто использовать withSession{} или withTransaction{}:

Я бы написал так:

Caller.withTransaction{
  int count = 0
  groovyFile.splitEachLine( ',' ){ String[] line ->
    Caller caller = new Caller( callingNumber:line[ 0 ], callerName:line[ 1 ] )
    if( !caller.save( flush:0 == count % 100 ) ) println caller.errors
    count++
  }
}

Вы не должны обрабатывать сессию вручную.

UPDATE

Почему транзакция делает быструю вставку при сбое сеанса?

Нет. Обычно транзакция автоматически переносит сеанс, поэтому withSession{} работает так же быстро, как и withTransaction{}.

Это потому, что сессия не очищала кэш должным образом или потому что каждый sql-запрос выполнял свою собственную очистку?

Да, кеш сессии не очищается, если вы не flush это или close это. Это то, что сделано в моем коде или в любой рекомендации по массовой обработке в GORM или Hibernate.

...