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

シンプルな永続マップ

もう1つの代替手段は、ディスクでバックアップされた永続マップを提供する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 に答える