1

クライアントごとに個別のデータベースがありますが、ビジネス ロジックとテーブルはクライアントごとに同じです。各クライアントに共通のサービスと dao レイヤーが必要です。dao では、ログに記録されたユーザー クライアントに基づいてデータソースを選択します。では@Transactional、トランザクション マネージャーの Bean ID を渡す必要があります。@Transactionalアノテーション付き共通サービスレイヤーの作り方。

同じ質問はこちら

  1. 複数のトランザクション マネージャー - 実行時に 1 つを選択する - Spring

  2. 実行時に複数のトランザクション マネージャーから選択する

しかし誰も返事をしない

4

2 に答える 2

0

データベース接続を動的に作成する場合は、この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 クラスで、DataSourceBean を注入する代わりに、上記のリンクで指定されているように動的に独自の dataSource を作成し、実行時にその依存関係を注入するか、getter setter メソッドを使用するか、newキーワードを使用します。それがうまくいくことを願っています。

注:まだ自分でテストしていないので、これが機能する場合はお知らせください。

于 2016-05-09T13:58:05.320 に答える