2012-09-05 7 views
12

Jesteśmy w trakcie aktualizacji z JBoss 6 do JBoss 7. Charakter naszej aplikacji ma oddzielną instancję bazy danych na klienta, a także konfigurację podstawową baza danych wspólna dla wszystkich klientów. Często mamy kod EJB, który przynajmniej odwołuje się do podstawowej bazy danych plus dane pojedynczego klienta w jednym wywołaniu, a nawet do ogólnych procesów w tle, które przechodzą przez wszystkich klientów.Błąd podczas pobierania połączeń w jboss do wielu baz danych, nawet jeśli nie ma transakcji

W JBoss 6 problem został rozwiązany bez problemu, ustawiając metodę z atrybutem transakcji NOT_SUPPORTED. Jednak JBoss 7 narzeka to z powodu następującego błędu:

ARJUNA012140: Adding multiple last resources is disallowed. Trying to add LastResourceRecord(XAOnePhaseResource([email protected][connectionListener=d3ce980 connectionManager=25b47a05 warned=false currentXid=< formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:11, node_name=1, branch_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:14, subordinatenodename=null, eis_name=unknown eis name >])), but already have LastResourceRecord(XAOnePhaseResource([email protected][connectionListener=1a05d94a connectionManager=135f1cfe warned=false currentXid=< formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:11, node_name=1, branch_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:13, subordinatenodename=null, eis_name=unknown eis name >]))

Jak możemy obejść ten problem bez owijania każde wezwanie do różnych baz danych w osobnym wezwanie EJB i transakcji. Czy istnieje sposób, aby rzeczywiście wyłączyć zarządzanie transakcjami JBoss w wywołaniu EJB lub coś podobnego?

Uwaga: to pytanie zostało zmodyfikowane po rozpoczęciu nagrody, w oparciu o dodatkowe odkrycie, aby wyostrzyć koncentrację na konkretnym problemie i usunąć inne możliwości, które zostały wykluczone.

+1

Znalazłem to. https://venugopaal.wordpress.com/2009/02/11/jboss5-adding-multiple-last-resources-is-disallowed/. Związane z? – pd40

Odpowiedz

7

OK, okazuje się, że w przeciwieństwie do JBoss6, transakcja NOT_SUPPORTED jest nadal transakcją, jeśli chodzi o logikę walidacji dla pobierania źródeł danych.

Sposobem na obejście tego jest, aby cały EJB fasoli udało transakcja:

@TransactionManagement(TransactionManagementType.BEAN) 

To niestety ogranicza pewną elastyczność, że niektórzy czasami wolisz opanować tę metodę-by-metody, ale nie jest zbyt bolesnym rozwiązaniem.

13

dwie sugestie:

  1. rozważyć aktualizację do źródeł danych w celu ich ekwiwalentów Xa. To rozwiąże wszystkie twoje problemy. Podejrzewam, że jesteś tu utrudniony?
  2. Rozważ ustawienie wartości com.arjuna.ats.arjuna.allowMultipleLastResources na wartość true w konfigurze serwera. Pozwoli to na zachowanie, które chcesz, ale niestety dla całej aplikacji, a nie tylko metody.

Aktualizacja:

Nie polecam umożliwiając wielu zasobów jednej fazy, ponieważ osłabia właściwości transakcyjnych z was aplikacja znacząco. Ale jeśli chcesz to zrobić w JBoss 7 trzeba zmodyfikować standalone.xml i dodać:

<system-properties> 
     <property name="com.arjuna.ats.arjuna.allowMultipleLastResources" value="true"/> 
</system-properties> 

Teraz masz system, który nie jest daleko od siebie bez transakcji. To, co nadal będzie robić, to ostrzec cię, jeśli uzyskasz heurystyczne wyniki.

Jeśli chcesz, nadal rekomenduję używanie źródeł danych XA.

Aktualizacja 2:

Aha, i jeśli ktoś przychodzi do odczytania tego chcę dodać, że jeśli można podzielić kod na różne sposoby, w przeciwieństwie do PO, polecam restrukturyzacji kodu i wykorzystanie @TransactionAttribute(REQUIRES_NEW) do tworzenia transakcji równoległych.Jest to lepsze niż włączenie wielu 1 PC, choć nie tak dobre, jak włączenie XA.

+0

Dzięki. Kradliśmy z XA, ale to nie działało (prawdopodobnie było to z naszej strony porażką), ale i tak było to niewłaściwe rozwiązanie, więc nie popychaliśmy w tym kierunku. Gdzie jest allowMultipleLastResources w JBoss 7, nie mogliśmy go znaleźć? – Yishai

+0

Zobacz aktualizację mojej odpowiedzi –

+0

Czy to zadziałało? –

Powiązane problemy