Groovy 中的持久性有哪些轻量级选项?到目前为止,我已经考虑过序列化和 XML,但我想要一些比这些更强大的东西,至少这样我不必每次都重写整个文件。理想情况下,它将:
- 在类路径中不需要 JAR,而是使用 Grapes
- 不需要外部流程、管理或身份验证(因此全部嵌入)
- 支持锁定
我计划使用它在独立的 Groovy 脚本运行之间缓存一些信息。我想响应将集中在 SQL 和 NoSQL 数据库上。链接到展示这种用法的页面将不胜感激。谢谢!
Groovy 中的持久性有哪些轻量级选项?到目前为止,我已经考虑过序列化和 XML,但我想要一些比这些更强大的东西,至少这样我不必每次都重写整个文件。理想情况下,它将:
我计划使用它在独立的 Groovy 脚本运行之间缓存一些信息。我想响应将集中在 SQL 和 NoSQL 数据库上。链接到展示这种用法的页面将不胜感激。谢谢!
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
这会将地图保存到一组文件中。
只是关于使用 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()
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()