2012-07-05 45 views
11

Groovy中持久性的一些輕量級選項是什麼?到目前爲止,我已經考慮過序列化和XML,但我希望比這些更強健一些,至少我不必每次都重寫整個文件。理想情況下,它會:輕量Groovy持久性

  • 需要在類路徑中沒有JAR文件,用葡萄代替
  • 不需要外部流程,管理或認證(所以所有的嵌入式)
  • 支持鎖定

我計劃使用它來緩存獨立Groovy腳本運行之間的一些信息。我想應該將重點放在SQL和NoSQL數據庫上。鏈接到頁面展示這種用法將不勝感激。謝謝!

回答

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小Groovy更新。現在支持併發訪問。名稱已從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() 
0

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