11

Groovy 中的持久性有哪些轻量级选项?到目前为止,我已经考虑过序列化和 XML,但我想要一些比这些更强大的东西,至少这样我不必每次都重写整个文件。理想情况下,它将:

  • 在类路径中不需要 JAR,而是使用 Grapes
  • 不需要外部流程、管理或身份验证(因此全部嵌入)
  • 支持锁定

我计划使用它在独立的 Groovy 脚本运行之间缓存一些信息。我想响应将集中在 SQL 和 NoSQL 数据库上。链接到展示这种用法的页面将不胜感激。谢谢!

4

4 回答 4

17

完整的 SQL 数据库

h2进程内SQL 数据库非常易于使用。这与 grails 默认使用的数据库引擎相同,但在 groovy 脚本中使用也很简单:

@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 数据库强大得多。不支持并发访问,但它是同步的和线程安全的,这可能就足够了,具体取决于您的锁定要求。这是一个简单的例子:

@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

这会将地图保存到一组文件中。

于 2012-07-05T14:58:27.830 回答
7

只是关于使用 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()
于 2013-07-23T23:58:32.237 回答
0

Chronicle Map是 JVM 的持久ConcurrentMap实现。

使用示例:

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()
于 2017-03-19T00:25:12.237 回答
0

我参加晚会有点晚了。但为了子孙后代,在这里列出另一个选项:

风暴

用于数据库和 CSV 文件的简单 ORM。旨在用于 groovy 脚本和小型项目

披露:作者在这里:)

于 2019-04-17T11:30:44.927 回答