5

我是 Java EE 6 的新手,所以如果这个问题的答案很明显,我深表歉意。我有一项必须每小时运行一次才能从数据库重建 Solr 索引的任务。我还希望在部署应用程序时进行重建。我的直觉是这应该有效:

@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);
  }
}

所以我有三个担心:

  1. 在部署时触发重建的适当方法是什么?一种@PostConstruct方法?
  2. 谁负责关闭数据库连接,这应该如何发生?我正在使用 myBatis,我相信它对 Java EE 生命周期一无所知。好像如果我使用@Singleton连接永远不会被释放,但是放@Startup一个@Statelessbean还有意义吗?
  3. Rebuilder 是否应该是单例?似乎不是我不能@PostConstruct用来处理初始重建,否则我每小时都会进行两次重建。

我不确定如何在这里进行。谢谢你的时间。

4

2 回答 2

1

我不知道 myBatis,但我可以告诉你,@Schedule 工作是事务性的。无论如何,我不确定 JTA 托管事务是否会根据您检索会话的方式应用在这里。
没有办法在 MyBatis 中检索 persistenceContext 吗?

对于触发器部分,恕我直言@Startup 将正确完成工作,因此需要一个单例 bean。无论如何,我无法告诉您您提出的两种方法中哪一种是最好的。

于 2013-03-05T09:23:31.340 回答
0

对于调度部分,您是正确的;我会在一个单独的类中编写索引构建逻辑,并在一个单独的类中同时使用(Singleton?)@StartUp bean 和 @Schedule-annotated 方法调用它。

如果您不想在索引构建代码和所述类中的触发代码之间存在依赖关系,则所述 bean 可以使用 JMS 来触发索引重建。

我不太了解 myBatis,但是如果您的连接是由数据源 @Resource 管理的,那么我相信它确实可以从 CMT 中受益。

于 2013-03-11T18:39:50.470 回答