2013-03-01 7 views
5

Java EE 6の新機能です。この質問に対する回答が明らかな場合はお詫び申し上げます。私は、データベースからSolrインデックスを再構築するために1時間ごとに実行する必要があるタスクがあります。また、アプリケーションのデプロイ時に再構築が必要になる。これが動作しなければならないことである私の本能は:Java EE 6(接続の有効期間)でスケジュールされたデータベースのメンテナンス

@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を使用しています。myBatisはJava EEのライフサイクルをあまり知らないと思います。 @Singletonを使用すると接続が解放されないようですが、@Stateless beanに@Startupを入れても意味がありますか?
  3. リビルドはシングルトンである必要がありますか?それが最初の再構築を処理するために@PostConstructを使用できなかったかのように思えるか、毎時2回再構築されます。

ここに進む方法はわかりません。御時間ありがとうございます。

答えて

1

私はmyBatisを知らないけど、@Scheduleジョブはトランザクションではないと伝えることができます。とにかく、あなたがセッションを取得する方法に従って、JTAが管理するトランザクションがここで適用されるかどうかはわかりません。
MyBatisでpersistenceContextを取得する方法はありませんか?

トリガー部分のIMHO @Startupは、ジョブを正しく実行し、シングルトンBeanが必要になります。とにかく私はあなたが提案する2つの方法のうちのどれが最良のものかをあなたに伝えることができません。

+0

いいえ、myBatisはJPA互換のORMではありません。 SpringとGuideの統合ライブラリはありますが、Java EEはありません。 –

+0

トランザクションを手動で管理するには、sessionFactoryをシングルトンに公開する必要があります。他の解決策は、バネ管理されたトランザクションを使用するか、myBatisの代わりにJPA実装に切り替えることです。 – Gab

+0

JPAでない場合、少なくともコンテナ管理のトランザクションを使用する方法でmyBatisを包括するにはどうすればよいですか?私はSpringのデプロイやJPAへの切り替えには興味がありません。私がしなければならないが、私はまだ彼らがコンテナ管理されていると思いますマニュアル取引を受け入れるよ。 –

0

スケジューリングの部分については正しいです。インデックス構築ロジックを別のクラスに記述し、(Singleton?)@StartUp beanと別のクラスの@ Schedule-annotatedメソッドの両方を呼び出します。

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

私はmyBatisについてよく分かりませんが、接続がデータソース@Resourceによって管理されている場合は、CMTのメリットが得られるはずです。

+0

myBatisはJava EEを完全に知らない。それを統合してCMTを得るために何が必要なのか分かりますか? –

+0

私はmyBatisを知らないのであまり助けられません。最初にEE環境でそれを使用しているのはなぜですか?永続性コードをJPAに準拠するものに移行する方が良いのではないか、このコンテキストの外でmyBatisを使用する方が良いでしょうか? – javabeats

+0

はい、助けてください。 –

関連する問題