Инициализировать приложение Grails с 10k записей - PullRequest
1 голос
/ 21 марта 2019

Я пытаюсь инициализировать новое приложение Grails с 10 тыс. Записей для одного класса / таблицы домена в качестве исходного набора данных.

Задача:

Я не хочу внедрять их в базу данных, так как я хотел бы, чтобы они проходили через все валидаторы Grails.

Что я сделал до сих пор:

Для начального набора данных, на моем компьютере разработчика, я ввел их в базу данных (через Talend Open Studio для интеграции данных ), а затем сгенерировал 10k New операторов, таких как:

New Entity(prop1:'val1',prop2:'val2');

Я пробовал с сотнями из них в Bootstrap, который отлично работает.Затем я попробовал с 10k из них, и Groovy Compiler иногда отслеживает стек Class file too large, а иногда он просто остается тихим и останавливается там.

Основная идея состоит в том, чтобы иметь что-то вроде

if (Entity.count == 0) {
    loadDataService.loadData()
}

Я не хочу этого признавать, но я также пытался создать 10 таких сервисов по 1000 записей в каждой и загружать их по одномудруг с другом, но затем потребление памяти в моей среде IDE достигает пространства, и все останавливается, а иногда оно приходит и говорит java.lang.RuntimeException: Method code too large! (ограничение 64 КБ в методах Java, что имеет смысл).

О чем еще я думал:

Кажется, что использование Rest-API будет единственным способом беспрепятственного получения 10k записей.Но для этой функции мне пришлось бы приложить усилия для ее разработки, и прежде чем я столкнусь с очередной неудачей, я бы воспользовался вашим советом.

Вопрос:

Как мне действовать дальше?Каков наилучший способ инициализации приложения?

1 Ответ

0 голосов
/ 26 марта 2019

Я получил решение, благодаря помощи @ Daniel и @ elixir На пути к разрешению я столкнулся с другой проблемой: время выполнения сильно увеличило записьпосле каждой записи, поэтому я должен был очистить сеанс гибернации.При этом время выполнения было похоже на «100 записей каждые 2-3 секунды», поэтому оно было линейным. Эта статья на grails.asia предоставила эту часть решения.

Итак, я получил следующий код:

Bootstrap.groovy:

    if (Entity.count == 0) {
        println "No Entity found - Launch initial import"
        loadDataService.loadData()
        println "Initial import finished"
    }

и внутри loadDataService :

SessionFactory sessionFactory
def loadData() {
    def inputFile = new File(grailsApplication.config.getProperty('importentitypath'))
    def InputJSON = new JsonSlurper().parseFile(inputFile, 'UTF-8')
    int mycounter = 0
    InputJSON.each{
        if (it.key=="data"){
            it.value.each {myrow ->
                mycounter+=1
                if ((mycounter % 100) == 0 ) {
                    println mycounter
                }
                Entity.withNewTransaction {
                    Entity.findByRowkey(myrow.rowkey)?:new Entity(
                            rowkey:myrow.rowkey,
                            property1: myrow.property1,
                            property2: myrow.property2,
                            ....
                    ).save(failOnError:true, flush:true)
                }
                sessionFactory.currentSession.clear()
            }
        }
    }
}

Еще раз спасибо за то, что привели меня к этому решению!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...