19
Polączenie za pomocą JNDI i DataSource Pule polączeń Klasy RowSet Wiązanie danych Kurs programowania aplikacji bazodanowych Wyklad 2 Pawel Rajba Instytut Informatyki Uniwersytet Wroclawski Pawel Rajba Kurs programowania aplikacji bazodanowych

Kurs programowania aplikacji bazodanowych - Wyk ad 2 · Większość tworzonych obecnie aplikacji to aplikacje webowe lub aplikacje typu desktop W tego typu aplikacjach występują

Embed Size (px)

Citation preview

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Kurs programowania aplikacji bazodanowychWykład 2

Paweł Rajba

Instytut InformatykiUniwersytet Wrocławski

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Plan wykładu

Połączenie za pomocą JNDI i DataSource

Pule połączeń

Klasy RowSet

Wiązanie danych

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Połączenie za pomocą JNDI i DataSource

Krótki wstęp do usług katalogowychDotychczas w celu uzyskania obiektu klasy Connectionwykorzystywaliśmy DriverManager.getConnection(URL)Lepszym sposobem jest wykorzystanie JNDI i interfejsuDataSourceScenariusz postępowania:

Najpierw tworzymy źródło danych z wykorzystaniem interfejsuDataSourceNastępnie, gdzieś w jakichś usługach katalogowych tenDataSource kojarzymy z przyjazną nazwą (robimy tzw. bind)

Powyższe dwa punkty są zwykle wykonywane przezadministratorów bez udziału programistów

W aplikacji tworzymy kontekst powiązany z tymi usługamikatalogowymi i pobieramy poprzez przyjazną nazwęzarejestrowany tam wcześniej DataSource (robimy tzw.lookup)

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Połączenie za pomocą JNDI i DataSource

Co zrobić, żeby za pomocą klasy DataSource dostać obiektklasy Connection?

Tworzymy obiekt DataSource za pomocą już konkretnejimplementacji interfejsu DataSource

w przypadku DBMS Oracle wykorzystamy klasęoracle.jdbc.pool.OracleDataSourcew przypadku DBMS SQL Server wykorzystay klasęcom.microsoft.sqlserver.jdbc.SQLServerDataSource

Ustawiamy parametry podstawowe parametry: adres serwera,port, nazwę użytkownika, hasło, nazwę bazy danychWywołujmy funkcję DataSource.getConnection() lubDataSource.getConnection(String username, Stringpassword)

Dodatkowo możemy ustawić lub pobrać obiekt, który jestodpowiedzialny za zapisywanie logówvoid setLogWriter(PrintWriter out)PrintWriter getLogWriter()

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Połączenie za pomocą JNDI i DataSource

A w jaki sposób pobrać obiekt DataSource z usługikatalogowej?

Tworzymy obiekt klasy InitialContextUstawiamy lokalizację usługi katalogowej wykorzystującfunkcję Context.addToEnvironment(String propName,Object propVal)Pobieramy obiekt klasy DataSource za pomocą metodyContext.lookup(nazwa)

Zalety rozważanego rozwiązaniaDzięki wykorzystaniu inferfejsu DataSource, pobranie obiektuConnection jest takie samo dla każdego DBMSDzięki JNDI, problem utworzenia obiektu DataSourcedelegujemy najczęściej na administratora usługi katalogowejKod napisany z wykorzystaniem tego schematu jest bardziejelastyczny i łatwiejszy do napisania

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Przykład

Przykład: JNDIExample

JNDIExample.java

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Pule połączeń

Komunikacja aplikacji z DBMS przebiega zwykle w jednym zdwóch schematów:Nawiązanie połączeniawykonywanie zapytań... (przerwa)wykonywanie zapytań

Zamknięcie połączeniaNawiązanie połączeniawykonywanie zapytań

Zamknięcie połączeniaNawiązanie połączeniawykonywanie zapytań

Zamknięcie połączeniaKażde w powyższych rozwiązań ma swoje wady. Rozwiązaniem jestużycie puli połączeń.

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Pule połączeń

Jak mogłaby działać taka pula?

Tworzymy klasę Manager, która przechowuje stos 20 obiektówklasy ConnectionKlasa X, która chce dostać obiekt Connection łączy się zobiektem Manager i dostaje obiekt ConnectionConnection getConnection()

Po skończeniu działania, klasa X oddaje obiektowi Managerpobrany wcześniej obiekt Connectionvoid returnConnection(Connection conn)

Pule połączeń są zaimplementowane w JDBC Optional Package ikorzystanie z nich jest prawie przeźroczyste.

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Pule połączeń

Źródło: Dany Ayers, et al., Professional Java Data, Wrox 2001

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Przykład

Przykład: ConnectionPooling

ConnectionPooling.java

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Obiekty klasy RowSet

Wszystkie implementacje RowSet są komponentamiJavaBeansDziedziczą z ResultSetMamy dwa rodzaje takich obiektów

połączeniowebezpołączeniowe

Implementacje połaczenioweJdbcRowSet

Implementacje bezpołączenioweCachedRowSetFilteredRowSetJoinRowSet

Są też RowSet typowo do zastosowań typu Web(WebRowSet)

Temu przyjrzymy się w ostatniej części wykładuBędziemy korzystać z implementacji Suna:

http://java.sun.com/products/jdbc/download.htmlPaweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Obiekty klasy RowSet

Żeby wykorzystać możliwości obiektu FilteredRowSet trzebautworzyć klasę implementującą interfejs PredicateInterfejs ten ma trzy metodyboolean evaluate(Object value, int column)boolean evaluate(Object value, String columnName)boolean evaluate(RowSet rs)

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Przykład

Przykład: RowSet

JdbcRowSetSample.java

CachedRowSetSample.java

JoinRowSetSample.java

FilteredRowSetSample.java, Range1.java, Range2.java

FilteredRowSetSample2.java, Range3.java

FilteredRowSetSample3.java, ParityPredicate.java

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Wiązanie danych

Większość tworzonych obecnie aplikacji to aplikacje webowelub aplikacje typu desktopW tego typu aplikacjach występują komponenty wizualne,które trzeba wypełnić danymi

Najpopularniejsze komponenty to: JList, JTable, JTree

Wypełnienie danymi może być wykonane na różne sposobyMy wykorzystamy mechanizm polegający na zdefiniowaniumodelu danychUtworzymy także odpowiednich słuchaczy, którzy będąreagować na zmiany w widoku i odpowiednio modyfikowaćmodel

Dalej przyjrzymy się kolejnym komponentom i ich obsłudze

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Wiązanie danych

Komponent JList

Reprezentuje dane w postaci listyUtworzenie modelu polega implementacji interfejsu ListModelvoid addListDataListener(ListDataListener l)Object getElementAt(int index)int getSize()void removeListDataListener(ListDataListener l)

Wygodne może być użycie jednej z gotowych implementacji:DefaultComboBoxModel dla JComboBoxDefaultListModel dla JList

Klasa, która będzie obsługiwać zmiany w modelu musiimplementować interfejs ListDataListenervoid contentsChanged(ListDataEvent e)void intervalAdded(ListDataEvent e)void intervalRemoved(ListDataEvent e)

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Wiązanie danych

Komponent JTableReprezentuje dane w postaci tabelarycznejUtworzenie modelu polega na implementacji interfejsuTableModel

void addTableModelListener(TableModelListener l)Object getValueAt(int row, int col)String getColumnName(int col)int getColumnCount(), int getRowCount()void removeTableModelListener(TableModelListener l)void setValueAt(Object aValue, int row, int col)boolean isCellEditable(int row, int col)Class getColumnClass(int column)

Wygodne może być użycie implementacji DefaultTableModelKlasa, która będzie obsługiwać zmiany w modelu musiimplementować interfejs TableModelListenervoid tableChanged(TableModelEvent e)

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Wiązanie danych

Komponent JTreeReprezentuje dane w postaci drzewa ukorzenionegoUtworzenie modelu polega na implementacji interfejsuTreeModel

void addTreeModelListener(TreeModelListener l)Object getChild(Object parent, int index)int getChildCount(Object parent)int getIndexOfChild(Object parent, Object child)Object getRoot()boolean isLeaf(Object node)void removeTreeModelListener(TreeModelListener l)void valueForPathChanged(TreePath path, ObjectnewValue)

Wygodne może być użycie implementacji DefaultTreeModelElementami drzewa mogą być obiekty klasyDefaultMutableTreeNode

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Wiązanie danych

Klasa, która będzie obsługiwać zmiany w modelu musiimplementować interfejs TreeModelListenervoid treeNodesChanged(TreeModelEvent e)void treeNodesInserted(TreeModelEvent e)void treeNodesRemoved(TreeModelEvent e)void treeStructureChanged(TreeModelEvent e)

Paweł Rajba Kurs programowania aplikacji bazodanowych

Połączenie za pomocą JNDI i DataSourcePule połączeńKlasy RowSet

Wiązanie danych

Przykład

Przykład: RowSet

ListComboBinding.java

TableBinding.java

TreeBinding.java

Paweł Rajba Kurs programowania aplikacji bazodanowych