2013-03-01 7 views
5

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:

  1. Qual è il modo appropriato per avviare una ricostruzione al momento dell'implementazione? Un metodo @PostConstruct?
  2. 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?
  3. 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.

risposta

1

Non conosco myBatis ma posso dirvi che il lavoro di @Schedule è transazionale. Ad ogni modo non sono sicuro che la transazione gestita da JTA verrà applicata qui in base al modo in cui recuperi la sessione.
Non c'è un modo per recuperare un persistenceContext in MyBatis?

Per la parte trigger, IMHO @Startup eseguirà correttamente il lavoro e avrà quindi bisogno di un bean singleton. Ad ogni modo non sono in grado di dirti quale dei 2 metodi che proponi è il migliore.

+0

No, myBatis non è un ORM compatibile con JPA. Esistono librerie di integrazione per Spring e Guide, ma non Java EE. –

+0

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

+0

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. –

0

Per la parte di pianificazione, si è corretti; Scriverò la logica di creazione dell'indice in una classe separata e avrò sia un (Singleton?) @StartUp bean che un metodo @ Schedule-annotated in una classe separata.

JMS può essere utilizzato da tali bean per attivare la ricostruzione dell'indice, se non si desidera avere una dipendenza tra il codice di creazione dell'indice e il codice di attivazione in dette classi.

Non conosco abbastanza bene myBatis, ma se la tua connessione è gestita da un'origine dati @Resource, allora credo che possa effettivamente trarre beneficio da CMT.

+0

myBatis è completamente all'oscuro di Java EE. Sai cosa avrei bisogno di fare per integrarlo e guadagnare CMT? –

+0

Non posso fare molto perché non conosco myBatis. Perché lo stai utilizzando in un ambiente EE in primo luogo? Non sarebbe meglio migrare il tuo codice di persistenza in qualche modo conforme a JPA o usare myBatis solo al di fuori di questo contesto? – javabeats

+0

Sì, è vero che non puoi aiuta molto. –

Problemi correlati