4
  • アプリケーションはSpring+hibernateにあります。
  • これには、3つのスキーマのmysqlテーブルが更新されるプロセスがあります。
  • スキーマごとに異なるdataSources、sessionFactories、transactionManagersがあります。
  • それぞれのスキーマテーブルでDB操作を実行する3つのDAOクラスがあります。
  • すべてのDB操作は1つのトランザクションの下で行われることになっているため、これらのdaoメソッドを1つのサービスメソッドから呼び出しています。

しかし、問題は、このサービスメソッドに注釈を付ける方法がわからないこと@Transactionalです。トランザクションアノテーションは1つのトランザクションマネージャーのみを受け入れますが、私は3を持っています。私のアプローチは間違っていますか?どうすればこれを解決できますか?

4

1 に答える 1

4

複数のトランザクションリソースを調整する必要がある場合、唯一の選択肢はJTAで分散トランザクション管理を使用することだと思います。 この記事では、JTAトランザクションマネージャを使用するようにSpringを設定する方法について説明します。

編集:

いくつかの調査を行った後、3つのデータソースが同じサーバーによってホストされている異なるスキーマ(mysqlのデータベースと同じもの)を実際に指している場合は、はるかに優れたオプションがあるようです。その場合、3つの接続すべてに使用される単一のユーザーがいる場合は、基本的にそれらを1つの単一の接続にマージし@Table、エンティティの注釈を使用して、エンティティが属するスキーマを指定できます@Table(schema = "schemaX")

これは、接続URLで指定されたデータベース名がデフォルトのデータベースのみを指定しているため(docを参照)、テーブル名を他のデータベース名で修飾するSQLステートメントを実行できます。これは、@TableアノテーションがHibernateにもたらすものとまったく同じです。

これで、単一の接続を使用することで、異なるスキーマのテーブルでアトミック更新を実行するという元の問題が解決されます。

于 2013-03-26T16:47:17.823 に答える