W jaki sposób stworzyć własny konektor jPALIO?

Klasą bazową dla wszystkich konektorów jPALIO jest klasa palio.connectors.Connector. Poprzez stworzenie klasy dziedziczącej po tej klasie można uzyskać prosty konektor, który jednak nie będzie posiadał wsparcia zarządzania pulą połączeń. W przypadku naturalnego dla jPALIO środowiska wielowątkowego dobrym rozwiązaniem, przez wzgląd na wydajność oraz oszczędność wykorzystanych zasobów, jest tworzenie konektorów wspierających pooling połączeń. jPALIO posiada wsparcie dla tworzenia konektorów wspierających zarządzanie pulą połączeń w postaci klasy palio.connector.PooledConnector.

Dobrą praktyką jest utworzenie modułu jPALIO związanego z danym konektorem udostępniającego jego API. Przykłady takich par:

W przypadku metod tych modułów, wykonujących dowolne operacje na konektorach, jako pierwszy argument podawana jest nazwa konektora, który powinien być użyty do wykonania danej operacji.

 

W tym rozdziale zostanie przedstawione w jaki sposób stworzyć konektor wspierający pooling połączeń.

Pierwszym krokiem jest utworzenie klasy dziedziczącej po klasie palio.connector.PooledConnector oraz klasy reprezentującej połączenie tworzone przez dany konektor. Klasa reprezentująca połączenie powinna być rozszerzeniem klasy palio.connector.PooledConnection. Klasa zapewnia ujednolicenie dostępu do różnego rodzaju połaczeń.

Klasa konektora powinna zapewnić implementację poniższych metod:

 

 protected PooledConnection newConnection(PooledConnection conn) throws Exception 

Metoda odpowiedzialna za tworzenie nowych połączeń. Jest wywoływana poprzez mechanizm zarządzania pulą połączeń w momencie gdy przy próbie pobrania połączenia żadne połączenie nie zostało do tej pory nawiązane lub wszystkie istniejące były w danej chwili zajęte.

 

void refreshConnection(PooledConnection connection) throws Exception

Metoda odpowiedzialna za podtrzymywania połączenia oraz diagnozowanie połączenia podczas procedury ponownego nawiązwyania połączenia (reconnect'u).

 

Klasa reprezentująca połączenie powinna zapewnić implementację poniższych metod:

 

protected void closeNormal()

Metoda odpowiedzialna za zamknięcie danego połączenia oraz zwolnienie zajętych zasobów. Metoda ta powinna być wykonywana w bieżącym wątku (synchronicznie)

 

protected void closeParaller()

Metoda odpowiedzialna za zamknięcie danego połączenia oraz zwolnienie zajętych zasobów. Metoda ta powinna być wykonywana w innym wątku (asynchronicznie). Używana jest do zamykania wielu połączeń bez blokady bieżącego wątku.

 

protected void setDedicated() throws PalioException

Metoda odpowiedzialna za ustawienie flagi oznaczającej, że dane połączenie jest przywiązane do bieżącego wątku i tylko bieżący wątek będzie mógł korzystać z tego połączenia do czasu gdy zostanie zwolnione. Metoda może wykonywać także inne, dodatkowe operacje, które są zależne od danego typu połączenia. Np. w przypadku konektora typu SQL jest to rozpoczęcie transakcji.

 

protected void unsetDedicated(

Metoda odpowiedzialna za zresetowanie flagi oznaczającej, że dane połaczenie jest przywiązane do bieżącego wątku. Metoda może wykonywać także inne, dodatkowe operacje, które są zależne od danego typu połączenia. Np. w przypadku konektora typu SQL jest to zakończenie transakcji oraz wycofanie zmian (rollback) jeżeli nie zostały wcześniej zatwierdzone (commit).

 

protected void resetExtend()

Metoda odpowiedzialna za wyczyszczenie "pozostałości" po poprzednim "użyciu". Jest wywoływana w monecie gdy po zakończeniu operacji na danym połaczeniu, połaczenie to wraca do puli wolnych połączeń.