3

バックエンドの 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 頂点にインデックスのないプロパティを作成するだけなので、ここでのクエリのパフォーマンスが心配です。

誰もこれについて経験がありますか?なにか提案を?

4

1 に答える 1

1

Java API を使用してパーティション分割された DB を作成する (興味があることを理解していれば) マクロの手順は次のとおりです。

  • 接続を取得します (プールを使用して、db のインスタンスを再利用します);
  • クラス V および E を変更します。書き込み可能な新しいユーザーを作成します。
  • データベースにログインすると、user1 は頂点を書き込むことができますが、user2 には見えません。

    //コントローラーに書き込みます: DB に書き込み可能なユーザーを作成します.............. Connection con = new Connection(); OrientGraph noTx = con.getConnection();

    //create partition
        noTx.begin();
        noTx.command(new OCommandSQL("ALTER CLASS V superclass orestricted")).execute();
        noTx.command(new OCommandSQL("ALTER CLASS E superclass orestricted")).execute();
        noTx.commit();
    
        //create different users
        noTx.begin();
        String ridRule = "";
        Iterable<Vertex> rule = noTx.command(new OCommandSQL("select from ORole where name = 'writer'")).execute();
        ridRule = rule.iterator().next().getId().toString();
        noTx.command(new OCommandSQL("INSERT INTO ouser SET name = 'user1', status = 'ACTIVE', password = 'user1', roles = ["+ridRule+"]")).execute();
        noTx.command(new OCommandSQL("INSERT INTO ouser SET name = 'user2', status = 'ACTIVE', password = 'user2', roles = ["+ridRule+"]")).execute();
        noTx.commit();
    
        //will not close the graph instance, but will keep open and available for the next requester
        noTx.shutdown();
    
        //finally To release all the instances and free all the resources
        con.clodeAllConnect();
    
    
        //WRITE IN YOUR CONTROLLER: LOGIN WITH USER APPROPRIATE .....................
        //CODE to login with user1 or user2,  CREATE VERTEX SET label = 'food', name = 'Pizza' etc....
    }
    
    
    //beans 
    public static class Connection {
    
        private OrientGraphFactory factory = null;
    
        public Connection() {
            //recyclable pool of instances 
            factory = new OrientGraphFactory("remote:localhost/blog").setupPool(1, 10);
        }
    
        //return the connection 
        public OrientGraph getConnection() {
            OrientGraph txGraph = factory.getTx();
            return txGraph;
        }
    
        public void clodeAllConnect(){
            factory.close();
    
        }
    }
    

これらの手順を調整してSpringに挿入するには、OrientDB-spring implementationであるこのリンクが役立つ場合があります。少ないですが参考になれば幸いです。

于 2016-03-18T16:12:27.280 に答える