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