2016-08-07 24 views
0

Javaを使用してマルチテナントアプリケーションを開発しています。この場合、私はApplication Server用にGlassFishを使用しています。 JerseyのRESTfulバックエンドを使用して、主にAngularJSで実行されます。 ORMを使用するつもりはありません。ほとんどのデータベースのやりとりは、ストアドプロシージャにコード化され最適化されるためです。複数のデータベース接続を動的に構成する最良の方法

アプリケーションデータ、構成、およびテナントリストを保持するメインデータベースがあります。今や、すべてのテナントは、それぞれ独自のデータベースを持ち、独自のデータを持つデータベース構造を持つことになります。アプリは各キーをチェックし、どのキーがどのユーザーに属しているか、そしてどのテナントに属するかを判断します。その後、それぞれのデータベースでそのユーザー要求を実行します。

問題は、Postgresはオンザフライでデータベースを切り替えることを許可しないため、接続文字列にハードコードする必要があり、他のデータベースを読み取らせません。唯一の方法は、データベースへの複数の接続を作成することです。また、テナントB接続からデータベーステナントAのストアドプロシージャを実行するのは賢明ではないと思います。

ApacheのBasicDataSourceを使用して実装しようとしましたが、GlassFishに独自のConnectionPoolがあるため、何か不足していると考え続けることはできません。 GlassFishのアプリケーションサーバーでApacheを使用することは冗長なようだが、単純なServletの代わりにApplication Serverを使用するという目的を上回るだろう。しかし、JNDIでハードコードなしでGlassFishのDataSourceを設定する方法については、何も参照できません。

以下は私の現在のApacheの実装です:

public static BasicDataSource createPool(String database) { 
    BasicDataSource ds = new BasicDataSource(); 
    ds.setDriverClassName(configFile.getValue("database.driver")); 
    ds.setUrl(configFile.getValue("database.url").concat(database)); 
    ds.setUsername(configFile.getValue("database.user")); 
    ds.setPassword(configFile.getValue("database.password")); 
    return ds; 
} 

私は、テナントごとに1つのJNDIを作成する以外にも、私は、データベース名がどうなるか分からないことが不可能です。私が知っている唯一のものは私の主要な構成データベースです。

GlassFishで未知のデータベース名への接続を開く方法についての提案はありますか?どうやって?それとも、私はApacheに固執すべきですか? Apacheを使用している場合は、GlassFishを完全に削除してTomcatを代わりに使用する方が良いでしょうか?

はありがとうなのGlassFishなどのJava EEサーバ上

答えて

0

JNDIデータソースを静的にバインドされ、完全に動作することのために設定されている必要があり、その期間中に変更することはできません。

JDBC接続プールは、 特定のデータベースの再利用可能な接続のグループです。

その他、プールが複数のデータベース接続プールを混在させている場合、サーバーがデータベース接続プールに対して必要な最適化を実行する方法を教えてください。 詳細については、Java EEデータソースhereに関する情報を参照してください。

あなたのケースでは、Glassfishが提供する静的に構成されたプールは無関係です。
したがって、接続プール用にGlassFishをインストールした場合は、実際には不要です。
さらに、Java EEサーバーはサーブレットコンテナがTomcatとしてはるかに多くのオーバーヘッド(cpu、メモリなど)を持っています。これは、GlassFishがこのゲームで最悪でない場合でもネイティブに多くの機能を提供するためです。
一般的なアドバイスとして、Java EEサーバーの多くの機能を使用しておらず、選択肢がある場合は、サーブレット・コンテナ以外のものを使用しないでください。
のJava EEサーバーを使用するには、他の引数は彼らのためにのみ利用できる特殊性を使用することができます:EJB、JTA、EAR、ベンダー固有の機能、より豊かな管理コンソール...

あなたのアイデア動的に作成するためにorg.apache.commons.dbcp.BasicDataSourceを使用しますデータソースとTomcatがあなたのニーズに合っているようです。

+0

ありがとうございます。私はJavaMailとJAX-WSとJerseyも使用しています。しかし、私はそれが完全な吹き飛ばされたアプリケーションサーバーを使用するのではなく、ライブラリを含めることをお勧めします。私は正しいですか? – Magician

+0

あなたは正しいです、あなたは大歓迎です。 Java EEの特定性を正確にするための私の答えを更新しました – davidxxx

+0

ああ..ありがとう – Magician

関連する問題