2015-05-07 17 views
5

Mam aplikację webservice z wiosną z Oracle jako bazę danych. W tej chwili mam źródło danych utworzone za pomocą serwera weblogic. Również za pomocą eclipse linkg JPA do wykonywania transakcji odczytu i zapisu (wstaw, Odczyt i aktualizacja). Teraz chcemy oddzielić źródła danych dla operacji odczytu (odczytu) i wrtie (wstawiania lub aktualizacji).Czy możemy mieć wiele źródeł danych do pojedynczej bazy danych?

Mój obecny DataSource jest jak następuje:

JNDI NAME : jdbc/POI_DS 
URL : jdbc:oracle:thin:@localhost:1521:XE 

używając tego robie zarówno odczytu i zapisu transakcji.

Co jeśli wykonaj następujące czynności:

JNDI NAME : jdbc/POI_DS_READ 
URL : jdbc:oracle:thin:@localhost:1521:XE 

JNDI NAME : jdbc/POI_DS_WRITE 
URL : jdbc:oracle:thin:@localhost:1521:XE 

Wiedziałem, że przy użyciu źródła danych XA możemy zdefiniować wiele źródeł danych. Czy mogę zrobić to samo bez źródła danych XA. Czy ktoś próbował tego rodzaju podejścia.

:: UPDATE ::

Dziękuję wszystkim za odpowiedzi I wprowadziły następujące rozwiązania.

Podjęłam podejście do wielu baz danych. gdzie zdefiniujesz wiele różnych transactionManagers i managerFactory. Wziąłem tylko pojedyncze źródło danych XA (JNDI), które jest refereowane w fasoli EntityManagerFactory.

można REEFER poniższe linki tutaj, które są dla wielu DataSources Multiple DataSource Approach defining @transactional value

zbadanych także na menedżerów transakcji org.springframework.transaction.jta.WebLogicJtaTransactionManager i org.springframework.orm.jpa.JpaTransactionManager również.

Odpowiedz

0

Istnieje ciekawy artykuł na ten temat w Spring docs - Dynamic DataSource Routing. Istnieje tam przykład, który pozwala w zasadzie zmienić źródła danych w czasie wykonywania. To powinno ci pomóc. Chętnie bym ci pomógł, jeśli masz więcej szczegółowych pytań.

EDYCJA: Mówi, że faktycznym użyciem jest połączenie z wieloma bazami danych za pomocą jednej konfiguracji, ale możesz utworzyć różne konfiguracje do jednej bazy danych z różnymi parametrami, tak jak potrzebujesz.

+0

szybkie pytanie, własność URL zdefiniowano różnie dla złota, srebra i brązu. jdbc: hsqldb: hsql: // localhost: $ {db.port.gold}/blog. W moim przypadku, jeśli używa się tego samego, ma jakiś problem. Również używam EclipseLink jako mojego JPA. Pozwól mi najpierw wykonać tę aplikację. – user1268890

+0

Po prostu utwórz Enum z właściwościami READ i WRITE, może działać w ten sam sposób. Podaj wymagane właściwości, zgodnie z potrzebami. Nie sądzę, aby pojawiły się dodatkowe problemy związane z dostawcą JPA. – user

0

Proponuję skorzystać z "usług" bazy danych. Każde obciążenie, tylko do odczytu i do odczytu i zapisu, będzie korzystać z własnej usługi dostępu do bazy danych. W ten sposób możesz użyć raportów AWR, aby uzyskać statystyki dla każdej usługi. Możesz także wyłączyć zapis-zapis, gdy tylko będziesz czytać i działać tylko do odczytu.

Oto wskazówka do dokumentacji bazy danych Oracle, który mówi o Usługi: https://docs.oracle.com/database/121/ADMIN/create.htm#CIABBCAI

0

Jeśli używasz sprężynę, powinieneś być w stanie to osiągnąć bez użycia 2 Datasources poprzez sprężyny @Transactional z zestawem readonly nieruchomości na prawdę. Powodem, dla którego proponuję to, jest to, że wydajesz się być zaniepokojony jedynie transakcyjnością i wydaje się, że jest to zaspokajane w ramach okresu wiosennego?

sugeruję coś takiego w Twoim przypadku:

@Transactional(readOnly = true) 
public class DefaultFooService implements FooService { 

    public Foo getFoo(String fooName) { 
     // do something 
    } 

    // these settings have precedence for this method 
    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 
    public void updateFoo(Foo foo) { 
     // do something 
    } 
} 

Korzystanie z tego stylu, powinieneś być w stanie podzielić czytać tylko usługi z ich odpowiednikami zapisu, lub nawet czytać i pisać metod usług połączonych. Ale oba te nie używają 2 źródeł danych.

Code jest od Spring Reference

0

jestem całkiem pewny, że trzeba rozwiązać problem w bazie danych/url + połączenie właściwości warstwy. Chciałbym google wokół coś podobnego do odczytu replikacji zapisu.

Powiązane z pytaniem dotyczącym JPA i transakcji. Jesteś skazany na zagładę, gdy korzystasz z wielu źródeł danych. Również źródła danych XA tak naprawdę nie są rozwiązaniem. Jedyne, co dla ciebie robią, to zapewnienie spójności w operacjach na wielu źródłach danych. Transakcja XA obejmuje tylko pewną logiczną transakcję w dwóch transakcjach (po jednej dla każdego źródła danych). Z punktu widzenia izolacji transakcji (o ile nie korzystasz z READ_UNCOMMITED) oba źródła danych wykorzystują własną transakcję. Oznacza to, że odczytane źródło danych nie zobaczy zmian wprowadzonych przez transakcję zapisu.

Powiązane problemy