Sono nuovo di Java EE 6 quindi mi scuso se la risposta a questa domanda è ovvia. Ho un'attività che deve essere eseguita ogni ora per ricostruire un indice Solr da un database. Voglio anche che la ricostruzione si verifichi quando l'app viene distribuita. Il mio istinto è che questo dovrebbe funzionare:Manutenzione del database pianificata con Java EE 6 (durata della connessione)
@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
}
}
Dal momento che sto usando myBatis, ho scritto questo produttore:
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);
}
}
Così ho tre preoccupazioni:
- Qual è il modo appropriato per avviare una ricostruzione al momento dell'implementazione? Un metodo
@PostConstruct
? - Chi è responsabile della chiusura della connessione al database e come dovrebbe accadere? Sto usando myBatis che è, credo, abbastanza ignorante del ciclo di vita di Java EE. Sembra che se io uso
@Singleton
le connessioni non verranno mai rilasciate, ma è anche significativo inserire@Startup
su un bean@Stateless
? - Il Rebuilder dovrebbe essere un singleton o no? Sembra che se non lo fosse non potrei usare
@PostConstruct
per gestire la ricostruzione iniziale o otterrò una doppia ricostruzione ogni ora.
Non sono sicuro di come procedere qui. Grazie per il tuo tempo.
No, myBatis non è un ORM compatibile con JPA. Esistono librerie di integrazione per Spring e Guide, ma non Java EE. –
Quindi sarà necessario esporre la sessione Factory al proprio singleton per gestire le transazioni manualmente. Un'altra soluzione è passare alla primavera per utilizzare la transazione gestita a molla o passare a un'implementazione JPA invece di myBatis. – Gab
Cosa occorrerebbe per concludere myBatis in modo che potesse almeno utilizzare transazioni gestite dal contenitore, se non fosse JPA? Non sono interessato a schierare Spring o passare a JPA; Accetterò le transazioni manuali se devo, ma preferirei che fossero gestite in container. –