Легкий 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. Предназначен для использования в отличных сценариях и небольших проектах
раскрытие: автор здесь :)