views:

187

answers:

3

Im working on some database migration code in Java. Im also using a factory pattern so I can use different kinds of databases. And each kind of database im using implements a common interface.

What I would like to do is have a migration check that is internal to the class and runs some database schema update code automatically. The actual update is pretty straight forward (I check schema version in a table and compare against a constant in my app to decide whether to migrate or not and between which versions of schema).

To make this automatic I was thinking the test should live inside (or be called from) the constructor. OK, fair enough, that's simple enough. My problem is that I dont want the test to run every single time I instantiate a database object (it runs a query so having it run on every construction is not efficient). So maybe this should be a class static method? I guess my question is, what is a good design pattern for this type of problem? There ought to be a clean way to ensure the migration test runs only once OR is super-efficient.

+1  A: 

Have a look at liquibase.
Here's an ibm developerworks article that has a nice walk-thru http://www.ibm.com/developerworks/java/library/j-ap08058/index.html

crowne
LiquiBase is a good tool if you have a single monolithic application that can be made to run on top of it. Since most commonly that indeed is the case, that's not a problem.
Esko
A: 

I've been using the iBatis SQL Mapper and really like it. The next version, iBatis 3.0, has schema migrations support. This is still in beta, but I'm planning on using it when it gets closer to a release candidate.

Jim Ferrans
A: 

Flyway fits your needs perfectly. It supports multiple databases, compares the schema version with the available migrations on the classpath and upgrades the database accordingly.

You can embed it in your application and have it run once on startup as described in the Flyway wiki.

Note: Flyway also comes with a Maven plugin and the ability to clean an existing schema in case you messed things up in development.

[Disclaimer: I'm one of Flyway's developers]

Axel Fontaine
I ended up writing my own migration code.
Eno