Lightweight Groovy persistence

Full SQL Database

The h2 in-process SQL database is very easy to use. This is the same database engine grails uses by default, but it's simple to use in a groovy script as well:

@GrabConfig(systemClassLoader=true)
@Grab(group='com.h2database', module='h2', version='1.3.167')

import groovy.sql.Sql

def sql = Sql.newInstance("jdbc:h2:hello", "sa", "sa", "org.h2.Driver")
sql.execute("create table test (id int, value text)")
sql.execute("insert into test values(:id, :value)", [id: 1, value: 'hello'])
println sql.rows("select * from test")

In this case the database will be saved to a file called hello.h2.db.

Simple Persistent Maps

Another alternative is jdbm, which provides disk-backed persistent maps. Internally, it uses Java's serialization. The programming interface is much simpler, but it's also much less powerful than a full-blown SQL db. There's no support for concurrent access, but it is synchronized and thread safe, which may be enough depending on your locking requirements. Here's a simple example:

@Grab(group='org.fusesource.jdbm', module='jdbm', version='2.0.1')

import jdbm.*

def recMan = RecordManagerFactory.createRecordManager('hello')
def treeMap = recMan.treeMap("test")
treeMap[1] = 'hello'
treeMap[100] = 'goodbye'
recMan.commit()
println treeMap

This will save the map to a set of files.


just a little groovy update on simple persistence using JDBM. Concurrent access is supported now. Name has changed from JDBM4 to MapDB.

@Grab(group='org.mapdb', module='mapdb', version='0.9.3')

import java.util.concurrent.ConcurrentNavigableMap
import org.mapdb.*

DB db = DBMaker.newFileDB( new File("myDB.file") )
           .closeOnJvmShutdown()
           .make()

ConcurrentNavigableMap<String,String> map = db.getTreeMap("myMap")

map.put("1", "one")
map.put("2", "two")
db.commit()

println "keySet "+map.keySet()

assert map.get("1") == "one"
assert map.get("2") == "two"

db.close()