クライアントごとに個別のデータベースがありますが、ビジネス ロジックとテーブルはクライアントごとに同じです。各クライアントに共通のサービスと dao レイヤーが必要です。dao では、ログに記録されたユーザー クライアントに基づいてデータソースを選択します。では@Transactional
、トランザクション マネージャーの Bean ID を渡す必要があります。@Transactional
アノテーション付き共通サービスレイヤーの作り方。
同じ質問はこちら
しかし誰も返事をしない
クライアントごとに個別のデータベースがありますが、ビジネス ロジックとテーブルはクライアントごとに同じです。各クライアントに共通のサービスと dao レイヤーが必要です。dao では、ログに記録されたユーザー クライアントに基づいてデータソースを選択します。では@Transactional
、トランザクション マネージャーの Bean ID を渡す必要があります。@Transactional
アノテーション付き共通サービスレイヤーの作り方。
同じ質問はこちら
しかし誰も返事をしない
データベース接続を動的に作成する場合は、このSO 投稿をご覧ください。
リンクされた投稿から:基本的にJDBCでは、これらのプロパティのほとんどはそのようなAPIで設定できず、実装に依存します。JDBC がこれを処理する方法は、ベンダーごとに異なる接続 URL を許可することです。
したがって、ドライバーを登録して、JDBC システムが URL の処理方法を認識できるようにします。
DriverManager.registerDriver((Driver)
Class.forName("com.mysql.jdbc.Driver").newInstance());
次に、URL を作成します。
String url =
"jdbc:mysql://[host][,failoverhost...][:port]/[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]"
最後に、それを使用して接続を取得します。
Connection c = DriverManager.getConnection(url);
より洗練された JDBC では、接続プールなどに関与し、多くの場合、アプリケーション サーバーには JNDI にドライバーを登録する独自の方法があり、そこから DataSource を検索して getConnection を呼び出します。
MySQL がサポートするプロパティについては、こちらを参照してください (リンクは無効です)。
編集: クラスにはバージョンを登録する独自の静的初期化子が必要なため、技術的には Class.forName("com.mysql.jdbc.Driver") を実行するコード行を持つだけで十分なはずです。 JDBC ドライバーはそうではないので、よくわからない場合は、2 つ目のドライバーを登録しても問題はほとんどありません。メモリ内に重複したオブジェクトが作成されるだけです。
私はそれをテストしていないので、これが機能するかどうかはわかりませんが、試すことができます.
今できることは、@Transactional
値を指定せずにDAOの上で注釈を使用することです(これは機能します)。DAO クラスで、DataSource
Bean を注入する代わりに、上記のリンクで指定されているように動的に独自の dataSource を作成し、実行時にその依存関係を注入するか、getter setter メソッドを使用するか、new
キーワードを使用します。それがうまくいくことを願っています。
注:まだ自分でテストしていないので、これが機能する場合はお知らせください。