我是 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);
}
}
所以我有三个担心:
- 在部署时触发重建的适当方法是什么?一种
@PostConstruct
方法? - 谁负责关闭数据库连接,这应该如何发生?我正在使用 myBatis,我相信它对 Java EE 生命周期一无所知。好像如果我使用
@Singleton
连接永远不会被释放,但是放@Startup
一个@Stateless
bean还有意义吗? - Rebuilder 是否应该是单例?似乎不是我不能
@PostConstruct
用来处理初始重建,否则我每小时都会进行两次重建。
我不确定如何在这里进行。谢谢你的时间。