Upload
hoangque
View
215
Download
0
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