轻量级Groovy持久性

时间:2012-07-05 13:58:44

标签: database groovy persistence

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

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

我打算用它来在一个独立的Groovy脚本的运行之间缓存一些信息。我想回应将集中在SQL和NoSQL数据库。显示此用法的页面的链接将不胜感激。谢谢!

4 个答案:

答案 0 :(得分: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 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

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

答案 1 :(得分: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()

答案 2 :(得分:0)

Chronicle Map是JVM的持久module.exports = { resolve: { extensions: [/*'.ts', '.tsx', */'.js'] }, entry: './scripts/main.js', output: { path: '/', filename: 'app.js' }, module: { rules: [ { test: /\.js$/, loader: 'source-map-loader', enforce: 'pre' } ], loaders: [ { test: /\.tsx?$/, loader: 'ts-loader', exclude: /node_modules/ }, {test: /\.css$/, loader: "style!css"} ] }, watch: true }; 实现。

用法示例:

ConcurrentMap

答案 3 :(得分:0)

我参加聚会不晚。但是为了后代,请在此处列出更多选项:

gstorm

  

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

披露:作者在这里:)