5

私は Java EE 6 を初めて使用するので、この質問に対する答えが明らかである場合は申し訳ありません。データベースから Solr インデックスを再構築するために、1 時間ごとに実行する必要があるタスクがあります。また、アプリのデプロイ時に再構築が行われるようにしたいと考えています。私の本能は、これがうまくいくはずだということです:

@Singleton
@Startup
public class Rebuilder {
  @Inject private ProposalDao proposalDao;
  @Inject private SolrServer  solrServer;

  @Schedule(hour="*", minute="0", second="0")
  public void rebuildIndex() {
    // do the rebuild here
  }
}

私は myBatis を使用しているので、次のプロデューサーを作成しました。

public class ProposalSessionProvider {
  private static final String CONFIGURATION_FILE = "...";

  static {
    try {
      sessFactory = new SqlSessionFactoryBuilder().build(
        Resources.getResourceAsReader(CONFIGURATION_FILE));
    }
    catch (IOException ex) {
      throw new RuntimeException("Error configuring MyBatis: " + ex.getMessage(), ex);
    }
  }

  @Produces
  public ProposalsDao openSession() {
    log.info("Connecting to the database");
    session = sessFactory.openSession();
    return session.getMapper(ProposalsDao.class);
  }
}

だから私は3つの懸念があります:

  1. 展開時に再構築をトリガーする適切な方法は何ですか? メソッド@PostConstruct
  2. データベース接続を閉じるのは誰の責任で、どのように行うべきですか? 私は myBatis を使用していますが、これは Java EE ライフサイクルについてかなり無知だと思います。使ったら繋がらなくなりそうな気もするけど、まめ@Singletonをつけても意味あるのかな?@Startup@Stateless
  3. Rebuilder はシングルトンである必要がありますか? そうでない場合@PostConstruct、最初の再構築を処理するために使用できなかったか、1 時間ごとに 2 回再構築が行われるようです。

ここでどのように進めればよいかよくわかりません。御時間ありがとうございます。

4

2 に答える 2

1

myBatis はわかりませんが、@Schedule ジョブはトランザクション型であると言えます。とにかく、セッションを取得する方法に応じて、JTA管理トランザクションがここに適用されるかどうかはわかりません。
MyBatis で persistenceContext を取得する方法はありませんか?

トリガー部分については、IMHO @Startup が適切に機能し、シングルトン Bean が必要になります。いずれにせよ、あなたが提案する 2 つの方法のどちらが最適かはわかりません。

于 2013-03-05T09:23:31.340 に答える
0

スケジューリング部分については、あなたは正しいです。別のクラスにインデックス構築ロジックを記述し、(Singleton?) @StartUp Bean と @Schedule アノテーション付きメソッドの両方を別のクラスに呼び出します。

インデックス構築コードと上記のクラスのトリガー コードとの間に依存関係を持たせたくない場合は、JMS を上記の Bean で使用してインデックスの再構築をトリガーすることができます。

myBatis についてはよくわかりませんが、接続がデータ ソース @Resource によって管理されている場合、CMT の恩恵を受けることができると思います。

于 2013-03-11T18:39:50.470 に答える