Jestem nowy w Java EE 6, więc przepraszam, jeśli odpowiedź na to pytanie jest oczywista. Mam zadanie, które musi być uruchamiane co godzinę, aby odbudować indeks Solr z bazy danych. Chcę również, aby odbudowa wystąpiła po wdrożeniu aplikacji. Mój instynkt jest to, że to powinno działać:Planowa konserwacja bazy danych za pomocą Java EE 6 (czas życia połączenia)
@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
}
}
Ponieważ używam myBatis, napisałem ten producent:
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);
}
}
Więc mam trzy problemy:
- Jaka jest odpowiedni sposób na wywołanie przebudowy w czasie wdrażania? Metoda
@PostConstruct
? - Kto jest odpowiedzialny za zamknięcie połączenia z bazą danych i jak to się dzieje? Używam myBatis, który jest, jak sądzę, całkiem nieświadomy cyklu życia Java EE. Wygląda na to, że jeśli użyję
@Singleton
, połączenia nigdy nie zostaną zwolnione, ale czy jest nawet sensowne umieszczenie@Startup
na fasoli@Stateless
? - Czy Rebuilder powinien być singletonem, czy nie? Wygląda na to, że jeśli nie, nie mógłbym użyć
@PostConstruct
do obsługi początkowego przebudowy, a co godzinę otrzymuję podwójne przebudowy.
Nie jestem pewien, jak postępować tutaj. Dziękuję za Twój czas.
Nie, myBatis nie jest zgodną z JPM ORM. Istnieją biblioteki integracyjne dla Spring i Guide, ale nie dla Java EE. –
Musisz więc wystawić swój sessionFactory na swój singleton w celu ręcznego zarządzania transakcjami. Innym rozwiązaniem jest przełączyć się na wiosnę, aby skorzystać z wiosennej transakcji lub przejść do implementacji JPA zamiast myBatis. – Gab
Co by było potrzebne, aby podsumować myBatis w taki sposób, aby mógł przynajmniej korzystać z transakcji zarządzanych przez kontener, jeśli nie był JPA? Nie jestem zainteresowany wdrażaniem Spring lub przejściem na JPA; Jeśli będę musiał, zaakceptuję transakcje ręczne, ale wolałbym, żeby były zarządzane przez kontener. –