2009-12-18 20 views
5

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:

  1. Zmień kolejność kodu, aby najpierw rozpocząć transakcję użytkownika, a następnie uzyskać połączenie z Datastore (jak wskazał Pascal Thivent).

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

Odpowiedz

2

Tak, twoje założenia są poprawne i, zgodnie z Create LLR-enabled JDBC data sources, twoje źródło danych wydaje się być poprawnie skonfigurowane.

Czy otrzymasz połączenie po rozpoczęciu transakcji użytkownika? Czy możesz pokazać swój kod lub pseudo kod?

UPDATE: Jak wspomniano w Programming Considerations and Limitations for LLR Data Sources:

  • When programming with an LLR data source, you must start the global transaction before calling getConnection on the LLR data source. If you call getConnection before starting the global transaction, all operations on the connection will be made outside of the global transaction.

Więc można spróbować to:

transaction.begin(); //start the global tx before calling getConnection() 
conn = dataSource.getConnection(); 
... 
transaction.commit(); 

Update2: Nie jestem pewien zrozumieć skąd 2. Połączenie nadchodzi (twój pseudo-kod nie pokazuje tego).Jednak, według tego samego Programming Considerations and Limitations for LLR Data Sources:

  • Only instances of a single LLR data source may participate in a particular transaction. A single LLR data source may have instances on multiple WebLogic servers, and two data sources are considered to be the same if they have the same configured name. If more than one LLR data source instance is detected and they are not instances of the same data source, the transaction manager will roll back the transaction.

Właściwie bez w pełni reprezentatywny przykład, czuję się trochę jak chodzenie w ciemności :)

+0

dzięki za pomoc do tej pory. Dodałem szkielet mojego kodu zgodnie z życzeniem. – lucasweb

+0

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