2013-03-01 13 views
5

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:

  1. Jaka jest odpowiedni sposób na wywołanie przebudowy w czasie wdrażania? Metoda @PostConstruct?
  2. 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?
  3. 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.

Odpowiedz

1

Nie wiem, myBatis, ale mogę Ci powiedzieć, że praca @Schedule jest transakcyjna. W każdym razie nie jestem pewien, czy transakcja zarządzana przez JTA zostanie zastosowana zgodnie ze sposobem pobierania sesji.
Czy nie ma sposobu na odzyskanie persistenceContext w MyBatis?
Dla części wyzwalającej IMHO @Startup wykona zadanie poprawnie i będzie potrzebować pojedynczej fasoli. W każdym razie nie jestem w stanie powiedzieć, która z 2 metod, które zaproponujesz, jest najlepsza.

+0

Nie, myBatis nie jest zgodną z JPM ORM. Istnieją biblioteki integracyjne dla Spring i Guide, ale nie dla Java EE. –

+0

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

+0

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

0

Dla części planowania, masz rację; Napisałem logikę budowania indeksu w osobnej klasie i posiadałem zarówno metodę bean (Singleton?) @StartUp, jak i metodę @ Schedule-annotated w osobnej klasie.

JMS może być używany przez wspomniane komponenty bean do wyzwalania przebudowy indeksu, jeśli nie chcemy mieć zależności między kodem budowania indeksu, a kodem wyzwalającym w tych klasach.

Nie znam mojej BATT wystarczająco dobrze, ale jeśli twoje połączenie jest zarządzane przez źródło danych @Resource, to wierzę, że może rzeczywiście skorzystać z CMT.

+0

myBatis jest całkowicie nieświadomy Java EE.Czy wiesz, co musiałbym zrobić, aby go zintegrować i uzyskać CMT? –

+0

Nie mogę pomóc, ponieważ nie znam myBatis. Dlaczego w pierwszej kolejności używasz go w środowisku EE? Czy nie byłoby lepiej albo przenieść twój kod trwałości do zgodności z JPA, albo użyć myBatis tylko poza tym kontekstem? – javabeats

+0

Tak, to prawda, że ​​nie możesz dużo pomóc. –

Powiązane problemy