2012-07-05 14 views
11

Groovyの永続性のための軽量オプションは何ですか?私はシリアライゼーションとXMLをこれまでのところ考えてきましたが、少なくともこれらのものよりも堅牢なものを欲しかったので、毎回ファイル全体を書き直す必要はありません。理想的には、それがあろう:軽量Groovy永続性

  • 代わり
  • のブドウを用いて、クラスパスにはJARファイルを必要としない私は計画外部プロセス、投与、又は

ロック認証(SOすべての埋め込み)

  • サポートを必要としませんそれを使用して、スタンドアロンのGroovyスクリプトの実行間にある情報をキャッシュします。私は、SQLとNoSQLのデータベースに焦点を当てた対応を考えています。この使用法を示すページへのリンクは高く評価されます。ありがとう!

  • 答えて

    17

    完全なSQLデータベース

    h2インプロセスSQLデータベースは、非常に使いやすいです。これは、同じデータベースエンジンのGrailsがデフォルトで使用されるが、それは同様にグルーヴィースクリプトで使用するために簡単です:この場合

    @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を使用した単純な永続性の更新について少し面白い更新です。同時アクセスは現在サポートされています。名前が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 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()