バックエンドの Spring アプリケーションと Orientdb グラフ データベースがあります。Tinkerpop Frames を使用して orientdb の頂点を Java オブジェクトにマップし、OPS4J をスプリング トランザクション管理に使用します。ここで、複数の顧客 (テナント) がこの 1 つのアプリケーション インスタンスを使用するマルチテナンシーを実装したいと考えています。このアプリケーションは完全に REST の原則に基づいて動作し、複数の Angular アプリケーション (顧客ごと) に開かれています。したがって、顧客と同じ数のフロントエンド Angular アプリケーションがあり、バックエンド REST Spring アプリケーションは 1 つだけです。バックエンドは HTTP リクエストからテナントを認識します。
今、私は最善の解決策について確信が持てません...
最初の解決策
Orientdb のドキュメントを読んだところ、orientdb でマルチテナンシーを実装する方法が見つかりました - http://orientdb.com/docs/2.1/Partitioned-Graphs.html。ただし、リクエストごとに新しいデータベース接続を作成したくない場合を除き、Java API を介して使用する方法がわかりません。現在、Spring トランザクション マネージャーは、Spring トランザクション管理構成で一元的に設定されている接続プールから接続を取得するためです。これに対するJavaの例は見つかりませんでした。
Spring トランザクション管理構成:
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
@Bean
@Qualifier("graphDbTx")
public OrientTransactionManager graphDbTransactionManager() {
OrientTransactionManager bean = new OrientTransactionManager();
bean.setDatabaseManager(graphDatabaseFactory());
return bean;
}
@Bean
public OrientBlueprintsGraphFactory graphDatabaseFactory() {
OrientBlueprintsGraphFactory dbf = new OrientBlueprintsGraphFactory();
dbf.setMaxPoolSize(6);
dbf.setUrl(DbConfig.DATABASE_URL);
dbf.setUsername("admin");
dbf.setPassword("admin");
return dbf;
}
@Bean
public FramedGraphFactory framedGraphFactory() {
return new FramedGraphFactory(new JavaHandlerModule());
}
}
接続の取得:
protected FramedGraph<OrientGraph> framedGraph() {
return framedGraphFactory.create(gdbf.graph());
}
2 番目の解決策
別の解決策は、ティンカーポップを使用することです
パーティショングラフ
クラスは Orientdb で動作しますが、Orientdb のドキュメントにはこの可能性に関する文章は見つかりませんでした。Tinkerpop ではこれだけです - https://github.com/tinkerpop/blueprints/wiki/Partition-Implementation。それは機能しますが、最終的にすべての orientdb 頂点にインデックスのないプロパティを作成するだけなので、ここでのクエリのパフォーマンスが心配です。
誰もこれについて経験がありますか?なにか提案を?