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サーバ上
ありがとうございます。私はJavaMailとJAX-WSとJerseyも使用しています。しかし、私はそれが完全な吹き飛ばされたアプリケーションサーバーを使用するのではなく、ライブラリを含めることをお勧めします。私は正しいですか? – Magician
あなたは正しいです、あなたは大歓迎です。 Java EEの特定性を正確にするための私の答えを更新しました – davidxxx
ああ..ありがとう – Magician