Aktualnie pobierane są zarówno dane UserTransaction, jak i DataSource z serwera Weblogic 10.3 przy użyciu JNDI.Jak uzyskać połączenia JDBC uzyskane ze źródła danych JNDI do udziału w UserTransaction za pomocą Weblogic 10.3?
mam ustawić źródła danych do „Wsparcie globalnych transakcji” i używać „Logging Ostatni zasobów”
Mam nadzieję, że przez rozpoczęciem UserTranscation a następnie pobierania połączenia JDBC ze źródła danych połączenia będą uczestniczyć w transakcja.
Nie ma to miejsca, a moje instrukcje wstawiania są natychmiast zatwierdzane, a wycofanie transakcji nie ma żadnego wpływu.
Czy moje powyższe założenia są prawidłowe?
Czy ktoś może wskazać mi jakiś dokument lub próbki, jak to osiągnąć?
Wiele z góry dzięki
UPDATE:
Zgodnie z wnioskiem o to szkic szkielet kodu używam:
private void doSomething() {
Connection conn = null;
try {
Hashtable env = new java.util.Hashtable();
env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
env.put(javax.naming.Context.PROVIDER_URL,"t3://localhost:8080");
InitialContext ctx = InitialContext(env));
UserTransaction transaction = null;
transaction = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
DataSource dataSource = (DataSource) context.lookup("jdbc/xxxxx/DataSource");
conn = dataSource.getConnection();
transaction.begin();
// JDBC code goes here
transaction.commit();
} catch(Exception e) {
// TODO
if (transaction != null) {
try {
transaction.rollback();
} catch (Exception ex) {
// TODO
}
} finally {
if (con != null) {
conn.close
}
}
}
UPDATE 2:
W celu rozwiązania ten problem musiałem zrobić 2 rzeczy:
Zmień kolejność kodu, aby najpierw rozpocząć transakcję użytkownika, a następnie uzyskać połączenie z Datastore (jak wskazał Pascal Thivent).
Zmień źródło danych, do którego odwołuje się "" jdbc/xxxxx/DataSource "" do źródła XADatasource. To dlatego, że wywoływałam kod w transakcji użytkownika, który korzystał z innego źródła danych, które zostało już skonfigurowane do obsługi LLR, a jak wskazał Pascal Thivent poniżej, możesz mieć tylko jedno źródło danych LLR uczestniczące w trans- akcji.
Zaakceptowałem odpowiedź Pascala Thivent poniżej, ponieważ objaśnia oba te problemy.
dzięki za pomoc do tej pory. Dodałem szkielet mojego kodu zgodnie z życzeniem. – lucasweb
Wypróbowałem twoją sugestię. Wynikał następujący błąd: Połączenie zostało już utworzone w tym kontekście tx dla puli o nazwie ABI_DS. Nielegalna próba utworzenia połączenia z innej puli: AMS_DS Gdzie ABI_DS jest źródłem danych, którego używam, a AMS_DS to inne źródło danych skonfigurowane dla tego samego wdrożenia – lucasweb