I have 48 domain classes in my Grails 2.1 project and I use Grails Database Migration Plugin 1.2 for a database management. Recently I've noticed that it becomes terribly slow when running application, even if there are no changes to be applied.
I switched do debug logging level for
liquibase package and I found that it takes about 15 seconds to parse
changelog.groovy and 20 files that were included in it!
I couldn't belive it so I've created two new clean changelogs:
$ grails dbm-generate-changelog changelog.groovy
$ grails dbm-generate-changelog changelog.xml
Both of these changelogs contain 229 change sets. It is enough that you can benchmark parsers for them. Two parsers in question are:
I need to modify a line in my Config.groovy and switch
changelog.xml for a second test:
grails.plugin.databasemigration.updateOnStart = true
grails.plugin.databasemigration.updateOnStartFileNames = ["changelog.groovy"]
// grails.plugin.databasemigration.updateOnStartFileNames = ["changelog.xml"]
Profile with JProfiler
I want to profile execution time. I use JProfiler from ej-technologies to measure execution times. Please notice that I don't want to benchmark SQL queries performed by liquibase. I am only focused on
parse method of these two classes.
Here's how I set up JProfiler:
I switch to CPU Views - Method statistics and I click "Record". Here are results for both parsers:
Results for changelog.groovy
Results for changelog.xml
My assumptions were correct: 8 339 ms vs 139 ms. Parsing XML is 60 times faster! I want to jump and sing: "I switch to XML now!", but I have some concerns. I have a production database that I need to be compatible with. And I should rewrite my all groovy changelog files by hand. So it's not so trivial and it's a time consuming and error prone task.
So as much as I want to switch to XML now, I won't. But if you start your adventure with database migration plugin today I have an advice for you: use XML if you start from scratch.
For now I've just submitted a new JIRA issue - GrailsChangeLogParser - parse method is very slow and I hope it can be greatly improved.