轻量级的Groovy持久化

11

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

  • 不需要在类路径中使用任何JAR文件,而使用Grapes代替
  • 无需外部进程、管理或身份验证(因此全部内嵌)
  • 支持锁定

我计划将其用于缓存一些在独立Groovy脚本运行期间的信息。我想回复会聚焦于SQL和NoSQL数据库。链接到演示此用法的页面将不胜感激。谢谢!

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

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


7

最近在使用JDBM进行简单持久化时有了一些改进。现在支持并发访问。同时也更名为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()

0

我来晚了,但为了后人,这里再列出一种选择:

gstorm

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

声明:我是作者 :)


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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接