440 likes | 591 Views
PAT: Persistent Applications Toolkit. Aplikacje bazodanowe bez bazy danych Tomasz Nazar. Plan. Czym jest? Czym nie jest? Geneza i potrzeba Kod źródłowy Programowanie aspektowe Baza danych: Prevayler PAT. Czym jest?. Platforma ( framework ), ale lekka http://patsystem.sf.net/
E N D
PAT: Persistent Applications Toolkit Aplikacje bazodanowe bez bazy danych Tomasz Nazar
Plan • Czym jest? • Czym nie jest? • Geneza i potrzeba • Kod źródłowy • Programowanie aspektowe • Baza danych: Prevayler • PAT
Czym jest? • Platforma (framework), ale lekka http://patsystem.sf.net/ • Ułatwia zapisywanie danych • Obiektowa • Przyśpiesza tworzenie aplikacji • Konieczna dodatkowa biblioteka • Zmiana procesu kompilacji (Ant) • Konieczny RAM
Czym nie jest? • Nie pozwoli udostępnić danych bazy danych na zewnątrz (RDBMS) • Nie ma ładnych narzędzi do podglądu danych • Nie wspiera 2PC • Rollback (ver. 1) • GUI tworzymy samemu • Nie będzie SQL
Geneza i potrzeba • 2003: Pi • Problem z RDBMS • Prevayler • Nadal pisanie kodu • 2004: AOP • Programowanie aspektowe • Powstanie PAT • 2005: Ax • Pierwsze wdrożenie
Geneza i potrzeba • Ewolucja i elastyczność • Łatwe testy • Prostota • Przejrzysta warstwa danych, POJO • Ładny kod; refaktoryzacja • Wydajność • Szybkość przeszukiwania danych
Kod źródłowy • Przykładowa klasa Forum realizująca jakąś logikę biznesową • Nowa wiadomość • Wyszukiwanie wiadomości
public class Forum { public Forum() { }
public class Forum { private List messages; public Forum() { }
public class Forum { private List messages; public Forum() { this.messages = new ArrayList(); }
public class Forum { private List messages; public Forum() { this.messages = new ArrayList(); } public void newMessage(String message) { messages.add(new Message(message)); }
public class Forum { private List messages; public Forum() { this.messages = new ArrayList(); } public void newMessage(String message) { messages.add(new Message(message)); } public String findMessageContaining(String substring) { for (Message message: messages.iterator()) if (message.matches(substring)) return message; }
@pat.bo public class Forum { private List messages; public Forum() { this.messages = new ArrayList(); } @pat.transaction public void newMessage(String message) { messages.add(new Message(message)); } public String findMessageContaining(String substring) { for (Message message: messages.iterator()) if (message.matches(substring)) return message; }
Programowanie aspektowe • Magia • Uzupełnia programowanie obiektowe • Polepsza modularyzację • Rozdziela zagadnienia • Ala triggery, lecz odnośnie kodu Javy
remoting persistence Forum Users Topics etc.. asynchronous invocation Core + usługi (aspekty)
remoting persistence Forum Users Topics etc.. asynchronous invocation Core + usługi (aspekty)
Aspekt: tracing • To także usługa • Przeplata wiele miejsc w kodzie • Jest ortogonalna do logiki biznesowej • Może być, lub nie być • Może być różnie zaimplementowana
Aspekt: tracing public ActionForward execute(...) { log.debug(„Starting loading data..”); List items = ItemsDao.loadAllItems(); //.... }
Aspekt: tracing public ActionForward execute(...) { List items = ItemsDao.loadAllItems(); //.... }
Aspekt? Jednostka, która definiuje: • co Aspect.trace() • kiedy execution • gdzie * *Action->execute(..) @marker->execute(..) ma być uruchomione
Aspekty • W takim razie kilka przykładów aspektów....
Aspekt: toString() • * -> toString(); public String toString() { return ToStringBuilder.reflectionToString( this, ToStringStyle.MULTI_LINE_STYLE ); }
Aspekt: onLoad(); dependency injection • @InitializeMe Public class Car { private Garage garage; } • Aspect.init(Object o) { o.garage = Globals.PUBLIC_GARAGE; }
Aspekt: autoryzacja • Dostęp do metod klasy, atrybutów, ... • Nie zmieniamy kodów źródłowych • Można w przyszłości wymienić system autoryzacji
Kto używa aspektów • Spring • JBoss AS • Aplikacje użytkowe
Prevayler • Baza danych • W pamięci RAM • Logi transakcji na dysku twardym • Szybka • Prosta do obsłużenia • Dla Javy ma jeden problem: kod transakcji
PAT • Na początku miał tylko uprościć Prevayler • Okazał się platformą do szybkiego tworzenia aplikacji: • Aplikacje biznesowe • Szybkie prototypowanie • Może działać razem z Tomcat, Struts, Ajax, Swing, Java5, ...
PAT: Jak? • pat-base-?.jar • pat-prevayler-?.jar • pat-aop-config-*.jar • @pat.bo, @pat.transaction, @pat.root • Kompilacja: statyczna, dynamiczna (Ant)
PAT: Klasy biznesowe • Forum.java • Metody • Atrybuty
PAT: Metody biznesowe • Metody: • Biznesowe, uaktualniające dane • Mają „przetrwać” • Przeszukujące dane • Mają być szybkie
PAT: Adnotacje • Klasa biznesowa: @pat.bo • Metoda biznesowa @pat.transaction
PAT: Pobieranie danych • Zwykła iteracja / Nawigowanie • Java5 • XPath • JoSQL
PAT: Zapisywanie danych • Tylko @pat.transaction na metodach • Aspekt, refleksja, podmiana • PersistableAspect.takeSnapshot() • Raz co jakiś czas
Kiedy wykorzystywać • Prototypowanie • Elastyczność • Prostota • ...
Prototypowanie public ... execute(.... { List myListA = world.getEmployees(); List myListB = EmployeesDao.findAll(); List myListC = JDBCTemplate.findAll(); List myListD = SQL.execute(„SELECT * FROM...”) }
PAT: Zbiór aspektów • RootCreation • BusinessObjectCreation • TopBusinessObjectCreation • CommandInterceptor • Identifiable • PersistableAspect • ...
Co dalej po PAT? • Zbiór aspektów: • Stringable • Struts (NotNull, Tracer) • Prails • Generowanie całych aplikacji • Wejście: Klasy biznesowe • Wyjście: Gotowa aplikacja webowa
Czym jest? • Platforma (framework), ale lekka • Ułatwia zapisywanie danych • Przyśpiesza tworzenie aplikacji • Konieczna dodatkowa biblioteka • Zmiana procesu kompilacji (Ant) • Konieczny RAM Czym nie jest?
Dziękuję • Pokaz praktyczny?