Javaオブジェクトを永続化させるEclipse Storeがよさそう

Eclipse Storeというのをみつけて、これはJavaオブジェクトを永続化するものなのだけど、トランザクションもあったりPostgreSQLなどのDBをバックエンドにできたり結構よさそう。
https://eclipsestore.io/

MicroStreamがEclipseに寄贈されてオープンソース化したものみたいですね。Eclipse Selializerとセットです。
https://github.com/microstream-one

ということでGetting Startedをみてみます。
https://docs.eclipsestore.io/manual/storage/getting-started.html

組み込み版を使うのでこんな感じのdependencyを追加

<dependencies>
    <dependency>
        <groupId>org.eclipse.store</groupId>
        <artifactId>storage-embedded</artifactId>
        <version>1.4.0</version>
    </dependency>
</dependencies>

依存ライブラリはこんな感じ。SLF4J以外はEclipse SelializerかEclipse Storeのものです。

ただ、baseとかpersistenceとか、簡素な名前のjarが多いので衝突することがありそう。

ともあれ、こんな感じのコードを。

import org.eclipse.store.storage.embedded.types.EmbeddedStorage;
import org.eclipse.store.storage.embedded.types.EmbeddedStorageManager;

void main() {
  EmbeddedStorageManager storageManager = EmbeddedStorage.start();

  storageManager.setRoot("Hello World! @ " + LocalDateTime.now());
  storageManager.storeRoot();

  storageManager.shutdown();
}

これで文字列がルートとしてストアされます。

import org.eclipse.store.storage.embedded.types.EmbeddedStorage;
import org.eclipse.store.storage.embedded.types.EmbeddedStorageManager;

void main() {
  EmbeddedStorageManager storageManager = EmbeddedStorage.start();
  println(storageManager.root());
  storageManager.shutdown();
}

これでこんな感じの表示がでて、ストアされてることがわかります。

Hello world! @ 2024-07-29T23:51:31.718432600

相互参照してると無限ループしたりしない?とあったのでこんなコードを動かします。

import org.eclipse.store.storage.embedded.types.EmbeddedStorage;
import org.eclipse.store.storage.embedded.types.EmbeddedStorageManager;

void main() {
  EmbeddedStorageManager man = EmbeddedStorage.start(Path.of("rec"));
  println(man.root());
  Data r = new Data("root");
  Data f = new Data("friend");
  r.friend = f;
  f.friend = r;
  man.setRoot(r);
  man.storeRoot();
  man.shutdown();
}
    
static class Data {
  Data friend;
  String name;

  public Data(String name) {
      this.name = name;
  }
  // friendとnameのsetter/getter略

  @Override
  public String toString() {
      var g = friend == null ? "" : (", other=" + friend.friend.name);
      return "Data{" + "name=" + name + ", friend=" + friend.name + g +  '}';
}

2回動かすとこのように表示されて、循環参照も問題なく扱えてることがわかります。

Data{name=root, friend=friend, other=root}

なかなかよさそう。クラスに変更があったときどうなるかなどは確認しないといけない。

この記事でインデックスデータをJSONにして保存してるけど、Eclipse Storeでそのまま保存するとよさそう。

Eclipse Serializerだけでもいいかもしれないけど。
https://docs.eclipsestore.io/manual/serializer/index.html