konto usunięte

Temat: Zend DB - wykorzystanie wiele baz danych

Witam

Czy spotkaliście się kiedykolwiek z przypadkiem wykorzystania kilku baz danych w ZF. Sytuacją w której konieczny był podział na bazy z rozdzieleniem zapytań typu select oraz insert?

Do tego celu można by wykorzystać własny adapter tworzący oddzielne połączenia dla query typu insert i select.

A może lepszy będzie podział typu kilka baz dla frontendu i oddzielna dla backendu?

konto usunięte

Temat: Zend DB - wykorzystanie wiele baz danych

Michał Chołuj:
Czy spotkaliście się kiedykolwiek z przypadkiem wykorzystania kilku baz danych w ZF. Sytuacją w której konieczny był podział na bazy z rozdzieleniem zapytań typu select oraz insert?

Do tego celu można by wykorzystać własny adapter tworzący oddzielne połączenia dla query typu insert i select.

Możesz równie dobrze wykorzystać kilka adapterów ZF - po jednym dla każdej bazy ;-)
Krzysztof Szatanik

Krzysztof Szatanik Starszy programista
PHP, Luxoft Poland

Temat: Zend DB - wykorzystanie wiele baz danych

Jeśli chodzi ci o dostęp do kilku różnych baz danych to ja to robię tworząc kilka różnych adapterów


$db = Zend_Db::factory ( $config->database->main );
$db_kartoteka = Zend_Db::factory ( $config->database->kartoteka );
$db_kssomed = Zend_Db::factory ( $config->database->kssomed );

Zend_Registry::set ( 'db', $db );
Zend_Registry::set ( 'db_kartoteka, $db_kartoteka );
Zend_Registry::set ( 'db_kssomed', $db_kssomed );

Zend_Db_Table::setDefaultAdapter ( $db );


i w określonych modelach mających korzystać z innej niż defaultowa baza wykorzystuję metodę


protected function _setupDatabaseAdapter() {
$this->_db = Zend_Registry::get('db_kartoteka');
}
Szymon Gregorczyk

Szymon Gregorczyk Developerem jestem
programistyczno-webo
wym

Temat: Zend DB - wykorzystanie wiele baz danych

Odnosnie tego czy sie spotkalem z takim podzialem to w Magento mozna ustawic osobne polaczenie do zapisywania oraz odczytywania danych do bazy - takie read_connection i write_connection - pewnie mozna ich wiecej nasadzic osobne dla kazdego modulu, wedle uznania, ale nie probowalem.

Podzial baz dla frontendu i backendu? Wlasciwie to czemu nie, ale oczywiscie bedziesz mial pewna nadmiarowosc danych - czesciowo te same dane we frontendzie i backendzie. We frontendzie dodatkowo mozna sobie pominac kilka joinow i zrobic z tego jedna tabele. Z drugiej strony wystarczy madrze pocache'owac dane po wyciagnieciu/obrobce.
Mysle ze takie podejscie ma sens gdy mozna dokladnie przetestowac jak to sie sprawdza w praktyce w konkretnym przypadku i czy nie jest to przerost formy nad trescia.

Co do kilku adapterow - kazdy do osobnej bazy - to sie sprawdzi tylko w przypadku gdy bazy beda od siebie niezalezne, tj. tabele z jednej bazy nie beda sie odnosily do tabel z innej bazy. Oczywiscie mozna sobie wyciagnac dane z kilku baz i pozniej je polaczyc itp itd ale niezbyt to wygodne.
Widzialem kiedys jakas biblioteke stworzona przez ktoras z polskich agencji, w ktorej byl adapter do wyciagania danych z kilku baz jednoczesnie. Nie kojarze obecnie ktora agencja to poczynila - nazwe biblioteka tez mialo jakas dziwna. Moze sie znajdzie w gaszczu ikonek na pulpicie pozniej.

edit: Wspomniana biblioteka to ganglib - rozwijana swego czasu przez wroclawskie Divante http://blog.divante.pl/ganglib/Szymon Gregorczyk edytował(a) ten post dnia 16.09.09 o godzinie 19:37

konto usunięte

Temat: Zend DB - wykorzystanie wiele baz danych

Co myślicie o rozwiązaniu tego typu:

Baza Master - wyłącznie dla insert
Bazy Slave - dla select

Na poziomie bazy synchronizacja danych z Master do Slave.
Nie tworzymy wielu adapterów bo to generuje konieczność decydowania na poziomie każdego modelu z czego korzystamy.

Ciekawe rozwiązanie:

- własny adapter ustawiony jako Default Adapter.
Jeśli ktoś nie używa ZDT - wrzucamy do registry.Michał Chołuj edytował(a) ten post dnia 16.09.09 o godzinie 21:26
Krzysztof Szatanik

Krzysztof Szatanik Starszy programista
PHP, Luxoft Poland

Temat: Zend DB - wykorzystanie wiele baz danych

Jeśli już bawimy się w podział zapytań na READ/WRITE to znacznie bezpieczniejsze i wygodniejsze będzie wykorzystanie do tego specjalistycznych rozwiązań w rodzaju pgPool czy MySQL Proxy.
Wojciech Szela

Wojciech Szela Director of
Engineering,
TheTower centrum
Jezykowe

Temat: Zend DB - wykorzystanie wiele baz danych

Michał Chołuj:
Co myślicie o rozwiązaniu tego typu:

Baza Master - wyłącznie dla insert
Bazy Slave - dla select

Bardzo popularne rozwiazanie. W takim przykladowo http://tuenti.com mielismy po jednym serwerze do zapisu (master) na kazda duza tabele (np. users) i kilka/kilkanascie serwerow do odczytu (slave). Najlepiej bedzie jesli napiszesz sobie wlasny adapter. Dzialajacy POC znajdziesz tu: http://zfuniversity.com/2009/10/04/federico-cargnelutt...

Podkreslam, POC, gdyz o ile dziala to wymaga pewnego wkladu pracy. Przykladowo, jesli zapis danych wyglada u ciebie tak:

1. zapisz do bazy

2. wyczysc cache

3. odczyt z bazy i zapis do cache (moze to byc inny proces)


to bardzo szybko zauwazysz problem ze zbyt wolna replikacja. Taki MySQL potrafi sie czasem przyciac i spozniac nawet godzine, a sekunda spoznienia od czasu do czasu to prawie norma. Oczywiscie insert() i update() moga czekac az replikacja zakonczy sie (tego wlasnie brakuje w POC).

Jak juz bedziesz pisal adapter z replikacja, moze przy okazji dodasz partycjonowanie danych i podzielisz sie kodem z kolegami?

konto usunięte

Temat: Zend DB - wykorzystanie wiele baz danych

Krzysztof Szatanik:
Jeśli już bawimy się w podział zapytań na READ/WRITE to znacznie bezpieczniejsze i wygodniejsze będzie wykorzystanie do tego specjalistycznych rozwiązań w rodzaju pgPool czy MySQL Proxy.

Zgadzam się - tego typu rozwiązanie jest bezpieczniejsze oraz mniej problemowe niż przykładowy adapter po stronie aplikacji PHP. Przy używaniu adaptera napotkałem wiele problemów min z transakcjami oraz czasem replikacji danych miedzy bazami.

Następna dyskusja:

Zend_Db_Table i wiele baz M...




Wyślij zaproszenie do