Легкий Groovy упорство

Каковы некоторые облегченные варианты сохранения в Groovy? Я рассматривал сериализацию и XML до сих пор, но я хочу, чтобы что-то было более надежным, чем те, по крайней мере, поэтому мне не нужно переписывать весь файл каждый раз. В идеале это было бы:

  • Не требуйте JAR в пути к классам, вместо этого используйте Grapes
  • Не требует внешних процессов, администрирования и аутентификации (поэтому все встроенные)
  • Поддержка блокировки

Я планирую использовать его для кэширования некоторой информации между прогонами автономного Groovy script. Я полагаю, что ответы будут сосредоточены вокруг баз данных SQL и NoSQL. Ссылки на страницы, демонстрирующие это использование, будут оценены. Спасибо!

Ответ 1

Полная база данных SQL

h2 встроенная база данных SQL очень проста в использовании. Это тот же самый сервер баз данных, который использует по умолчанию сервер Grails, но его просто использовать в groovy script:

@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")

В этом случае база данных будет сохранена в файл с именем hello.h2.db.

Простые постоянные карты

Другой альтернативой является jdbm, которая обеспечивает жесткие карты с поддержкой диска. Внутри он использует сериализацию Java. Интерфейс программирования намного проще, но он также намного менее мощный, чем полноразмерный SQL-db. Там нет поддержки параллельного доступа, но он синхронизирован и потокобезопасен, чего может быть достаточно в зависимости от ваших требований к блокировке. Вот простой пример:

@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

Это сохранит карту в наборе файлов.

Ответ 2

всего лишь небольшое обновление groovy для простой настойчивости с использованием JDBM. Параллельный доступ поддерживается сейчас. Имя изменилось с JDBM4 на 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()

Ответ 3

Chronicle Map - это постоянная реализация ConcurrentMap для JVM.

Пример использования:

ConcurrentMap<String, String> store = ChronicleMap
    .of(String.class, String.class)
    .averageKey("cachedKey").averageValue("cachedValue")
    .entries(10_000)
    .createPersistedTo(new File("cacheFile"))

store.put("foo", "bar")
store.close()

Ответ 4

Я немного опоздал на вечеринку. Но ради потомства перечислим еще один вариант здесь:

gstorm

Простой ORM для баз данных и файлов CSV. Предназначен для использования в отличных сценариях и небольших проектах

раскрытие: автор здесь :)