| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> |
| <html> |
| <head> |
| <!-- |
| Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved. |
| DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| |
| This code is free software; you can redistribute it and/or modify it |
| under the terms of the GNU General Public License version 2 only, as |
| published by the Free Software Foundation. Oracle designates this |
| particular file as subject to the "Classpath" exception as provided |
| by Oracle in the LICENSE file that accompanied this code. |
| |
| This code is distributed in the hope that it will be useful, but WITHOUT |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| version 2 for more details (a copy is included in the LICENSE file that |
| accompanied this code). |
| |
| You should have received a copy of the GNU General Public License version |
| 2 along with this work; if not, write to the Free Software Foundation, |
| Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| |
| Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| or visit www.oracle.com if you need additional information or have any |
| questions. |
| --> |
| |
| </head> |
| |
| |
| |
| <body bgcolor="white"> |
| |
| Provides the API for server side data source access and processing from |
| the Java<sup><font size=-2>TM</font></sup> programming language. |
| This package supplements the <code>java.sql</code> |
| package and, as of the version 1.4 release, is included in the |
| Java Platform, Standard Edition |
| (Java SE<sup><font size=-2>TM</sup></font>). |
| It remains an essential part of the Java Platform, Enterprise Edition |
| (Java EE<sup><font size=-2>TM</sup></font>). |
| <P> |
| The <code>javax.sql</code> package provides for the following: |
| <OL> |
| <LI>The <code>DataSource</code> interface as an alternative to the |
| <code>DriverManager</code> for establishing a |
| connection with a data source |
| <LI>Connection pooling and Statement pooling |
| <LI>Distributed transactions |
| <LI>Rowsets |
| </OL> |
| <P> |
| Applications use the <code>DataSource</code> and <code>RowSet</code> |
| APIs directly, but the connection pooling and distributed transaction |
| APIs are used internally by the middle-tier infrastructure. |
| |
| <H2>Using a <code>DataSource</code> Object to Make a Connection</H2> |
| |
| The <code>javax.sql</code> package provides the preferred |
| way to make a connection with a data source. The <code>DriverManager</code> |
| class, the original mechanism, is still valid, and code using it will |
| continue to run. However, the newer <code>DataSource</code> mechanism |
| is preferred because it offers many advantages over the |
| <code>DriverManager</code> mechanism. |
| <P> |
| These are the main advantages of using a <code>DataSource</code> object to |
| make a connection: |
| <UL> |
| |
| <LI>Changes can be made to a data source's properties, which means |
| that it is not necessary to make changes in application code when |
| something about the data source or driver changes. |
| <LI>Connection and Statement pooling and distributed transactions are available |
| through a <code>DataSource</code> object that is |
| implemented to work with the middle-tier infrastructure. |
| Connections made through the <code>DriverManager</code> |
| do not have connection and statement pooling or distributed transaction |
| capabilities. |
| </UL> |
| <P> |
| Driver vendors provide <code>DataSource</code> implementations. A |
| particular <code>DataSource</code> object represents a particular |
| physical data source, and each connection the <code>DataSource</code> object |
| creates is a connection to that physical data source. |
| <P> |
| A logical name for the data source is registered with a naming service that |
| uses the Java Naming and Directory Interface<sup><font size=-2>TM</font></sup> |
| (JNDI) API, usually by a system administrator or someone performing the |
| duties of a system administrator. An application can retrieve the |
| <code>DataSource</code> object it wants by doing a lookup on the logical |
| name that has been registered for it. The application can then use the |
| <code>DataSource</code> object to create a connection to the physical data |
| source it represents. |
| <P> |
| A <code>DataSource</code> object can be implemented to work with the |
| middle tier infrastructure so that the connections it produces will be |
| pooled for reuse. An application that uses such a <code>DataSource</code> |
| implementation will automatically get a connection that participates in |
| connection pooling. |
| A <code>DataSource</code> object can also be implemented to work with the |
| middle tier infrastructure so that the connections it produces can be |
| used for distributed transactions without any special coding. |
| |
| <H2>Connection Pooling and Statement Pooling</H2> |
| |
| Connections made via a <code>DataSource</code> |
| object that is implemented to work with a middle tier connection pool manager |
| will participate in connection pooling. This can improve performance |
| dramatically because creating new connections is very expensive. |
| Connection pooling allows a connection to be used and reused, |
| thus cutting down substantially on the number of new connections |
| that need to be created. |
| <P> |
| Connection pooling is totally transparent. It is done automatically |
| in the middle tier of a Java EE configuration, so from an application's |
| viewpoint, no change in code is required. An application simply uses |
| the <code>DataSource.getConnection</code> method to get the pooled |
| connection and uses it the same way it uses any <code>Connection</code> |
| object. |
| <P> |
| The classes and interfaces used for connection pooling are: |
| <UL> |
| <LI><code>ConnectionPoolDataSource</code> |
| <LI><code>PooledConnection</code> |
| <LI><code>ConnectionEvent</code> |
| <LI><code>ConnectionEventListener</code> |
| <LI><code>StatementEvent</code> |
| <LI><code>StatementEventListener</code> |
| </UL> |
| The connection pool manager, a facility in the middle tier of |
| a three-tier architecture, uses these classes and interfaces |
| behind the scenes. When a <code>ConnectionPoolDataSource</code> object |
| is called on to create a <code>PooledConnection</code> object, the |
| connection pool manager will register as a <code>ConnectionEventListener</code> |
| object with the new <code>PooledConnection</code> object. When the connection |
| is closed or there is an error, the connection pool manager (being a listener) |
| gets a notification that includes a <code>ConnectionEvent</code> object. |
| <p> |
| If the connection pool manager supports <code>Statement</code> pooling, for |
| <code>PreparedStatements</code>, which can be determined by invoking the method |
| <code>DatabaseMetaData.supportsStatementPooling</code>, the |
| connection pool manager will register as a <code>StatementEventListener</code> |
| object with the new <code>PooledConnection</code> object. When the |
| <code>PreparedStatement</code> is closed or there is an error, the connection |
| pool manager (being a listener) |
| gets a notification that includes a <code>StatementEvent</code> object. |
| <p> |
| |
| <H2>Distributed Transactions</H2> |
| |
| As with pooled connections, connections made via a <code>DataSource</code> |
| object that is implemented to work with the middle tier infrastructure |
| may participate in distributed transactions. This gives an application |
| the ability to involve data sources on multiple servers in a single |
| transaction. |
| <P> |
| The classes and interfaces used for distributed transactions are: |
| <UL> |
| <LI><code>XADataSource</code> |
| <LI><code>XAConnection</code> |
| </UL> |
| These interfaces are used by the transaction manager; an application does |
| not use them directly. |
| <P> |
| The <code>XAConnection</code> interface is derived from the |
| <code>PooledConnection</code> interface, so what applies to a pooled connection |
| also applies to a connection that is part of a distributed transaction. |
| A transaction manager in the middle tier handles everything transparently. |
| The only change in application code is that an application cannot do anything |
| that would interfere with the transaction manager's handling of the transaction. |
| Specifically, an application cannot call the methods <code>Connection.commit</code> |
| or <code>Connection.rollback</code>, and it cannot set the connection to be in |
| auto-commit mode (that is, it cannot call |
| <code>Connection.setAutoCommit(true)</code>). |
| <P> |
| An application does not need to do anything special to participate in a |
| distributed transaction. |
| It simply creates connections to the data sources it wants to use via |
| the <code>DataSource.getConnection</code> method, just as it normally does. |
| The transaction manager manages the transaction behind the scenes. The |
| <code>XADataSource</code> interface creates <code>XAConnection</code> objects, and |
| each <code>XAConnection</code> object creates an <code>XAResource</code> object |
| that the transaction manager uses to manage the connection. |
| |
| |
| <H2>Rowsets</H2> |
| The <code>RowSet</code> interface works with various other classes and |
| interfaces behind the scenes. These can be grouped into three categories. |
| <OL> |
| <LI>Event Notification |
| <UL> |
| <LI><code>RowSetListener</code><br> |
| A <code>RowSet</code> object is a JavaBeans<sup><font size=-2>TM</font></sup> |
| component because it has properties and participates in the JavaBeans |
| event notification mechanism. The <code>RowSetListener</code> interface |
| is implemented by a component that wants to be notified about events that |
| occur to a particular <code>RowSet</code> object. Such a component registers |
| itself as a listener with a rowset via the <code>RowSet.addRowSetListener</code> |
| method. |
| <P> |
| When the <code>RowSet</code> object changes one of its rows, changes all of |
| it rows, or moves its cursor, it also notifies each listener that is registered |
| with it. The listener reacts by carrying out its implementation of the |
| notification method called on it. |
| <P> |
| <LI><code>RowSetEvent</code><br> |
| As part of its internal notification process, a <code>RowSet</code> object |
| creates an instance of <code>RowSetEvent</code> and passes it to the listener. |
| The listener can use this <code>RowSetEvent</code> object to find out which rowset |
| had the event. |
| </UL> |
| <P> |
| <LI>Metadata |
| <UL> |
| <LI><code>RowSetMetaData</code><br> |
| This interface, derived from the |
| <code>ResultSetMetaData</code> interface, provides information about |
| the columns in a <code>RowSet</code> object. An application can use |
| <code>RowSetMetaData</code> methods to find out how many columns the |
| rowset contains and what kind of data each column can contain. |
| <P> |
| The <code>RowSetMetaData</code> interface provides methods for |
| setting the information about columns, but an application would not |
| normally use these methods. When an application calls the <code>RowSet</code> |
| method <code>execute</code>, the <code>RowSet</code> object will contain |
| a new set of rows, and its <code>RowSetMetaData</code> object will have been |
| internally updated to contain information about the new columns. |
| <P> |
| </UL> |
| <LI>The Reader/Writer Facility<br> |
| A <code>RowSet</code> object that implements the <code>RowSetInternal</code> |
| interface can call on the <code>RowSetReader</code> object associated with it |
| to populate itself with data. It can also call on the <code>RowSetWriter</code> |
| object associated with it to write any changes to its rows back to the |
| data source from which it originally got the rows. |
| A rowset that remains connected to its data source does not need to use a |
| reader and writer because it can simply operate on the data source directly. |
| |
| <UL> |
| <LI><code>RowSetInternal</code><br> |
| By implementing the <code>RowSetInternal</code> interface, a |
| <code>RowSet</code> object gets access to |
| its internal state and is able to call on its reader and writer. A rowset |
| keeps track of the values in its current rows and of the values that immediately |
| preceded the current ones, referred to as the <i>original</i> values. A rowset |
| also keeps track of (1) the parameters that have been set for its command and |
| (2) the connection that was passed to it, if any. A rowset uses the |
| <code>RowSetInternal</code> methods behind the scenes to get access to |
| this information. An application does not normally invoke these methods directly. |
| <P> |
| <LI><code>RowSetReader</code><br> |
| A disconnected <code>RowSet</code> object that has implemented the |
| <code>RowSetInternal</code> interface can call on its reader (the |
| <code>RowSetReader</code> object associated with it) to populate it with |
| data. When an application calls the <code>RowSet.execute</code> method, |
| that method calls on the rowset's reader to do much of the work. Implementations |
| can vary widely, but generally a reader makes a connection to the data source, |
| reads data from the data source and populates the rowset with it, and closes |
| the connection. A reader may also update the <code>RowSetMetaData</code> object |
| for its rowset. The rowset's internal state is also updated, either by the |
| reader or directly by the method <code>RowSet.execute</code>. |
| |
| |
| <LI><code>RowSetWriter</code><br> |
| A disconnected <code>RowSet</code> object that has implemented the |
| <code>RowSetInternal</code> interface can call on its writer (the |
| <code>RowSetWriter</code> object associated with it) to write changes |
| back to the underlying data source. Implementations may vary widely, but |
| generally, a writer will do the following: |
| |
| <P> |
| <UL> |
| <LI>Make a connection to the data source |
| <LI>Check to see whether there is a conflict, that is, whether |
| a value that has been changed in the rowset has also been changed |
| in the data source |
| <LI>Write the new values to the data source if there is no conflict |
| <LI>Close the connection |
| </UL> |
| |
| |
| </UL> |
| </OL> |
| <P> |
| The <code>RowSet</code> interface may be implemented in any number of |
| ways, and anyone may write an implementation. Developers are encouraged |
| to use their imaginations in coming up with new ways to use rowsets. |
| <P> |
| <B>IMPORTANT NOTE:</B> Code that uses API marked "Since 1.6" must be run using a |
| JDBC technology driver that implements the JDBC 4.0 API. |
| You must check your driver documentation to be sure that it implements |
| the particular features you want to use. |
| <P> |
| |
| <h2>Package Specification</h2> |
| |
| <ul> |
| <li><a href="http://java.sun.com/products/jdbc/download.html">Specification of the |
| JDBC 4.0 API</a> |
| </ul> |
| |
| <h2>Related Documentation</h2> |
| |
| The Java Series book published by Addison-Wesley Longman provides detailed |
| information about the classes and interfaces in the <code>javax.sql</code> |
| package: |
| |
| <ul> |
| <li><a href="http://java.sun.com/docs/books/jdbc"><i>JDBC<sup><font size=-2>TM</font></sup> |
| API Tutorial and Reference, Third Edition:</i></a> |
| </ul> |
| <P> |
| @since 1.4 |
| </body> |
| </html> |