|Prev | Next||J2EETM Developer's Guide
lookupwhen obtaining the database connection. This level of indirection provides several benefits:
java.sql.Connection, that represents a session with the resource manager (DBMS). A resource manager connection factory is an object that creates resource manager connections. For example, a
javax.sql.DataSourceobject is a connection factory because it creates a
AccountEJBclass uses bean-managed persistence, it connects to the database with the following steps:
1. Specify the logical database name.
Theprivate String dbName = "java:comp/env/jdbc/AccountDB";
java:comp/env/prefix is the JNDI context for the component. The
jdbc/AccountDBstring is the logical database name.
2. Obtain the
DataSource associated with the logical name.
3. Get theInitialContext ic = new InitialContext(); DataSource ds = (DataSource) ic.lookup(dbName);
Connection con = ds.getConnection();
ejbCreatemethod at the beginning of a session bean's life cycle, and invokes the
ejbRemovemethod at the end. To retain a connection for the lifetime of a session bean, you connect to the database in
ejbCreateand disconnect in
ejbRemove. If the session bean is stateful, you must also connect in
ejbActivateand disconnect in
ejbPassivate. A stateful session bean requires these additional calls because the EJB container may passivate the bean during its lifetime. During passivation, a stateful session bean is saved in secondary storage, but a database connection may not be saved in this manner. Because a stateless session bean cannot be passivated, it does not require the additional calls in
ejbPassivate. For more information on activation and passivation, see the section, "The Life Cycle of a Session Bean". For an example of a stateful session bean with a longterm connection, see the TellerEJB.java code.
setEntityContextmethod. Conversely, the EJB container invokes the
unsetEntityContextmethod when the entity bean leaves the pooled stage and becomes eligible for garbage collection. To retain a database connection for its entire lifespan, an entity bean connects in the
setEntityContextmethod and disconnects in the
unsetEntityContextmethod. To see a diagram of the life cycle, refer to the section, "The Life Cycle of an Entity Bean". For an example of an entity bean with a longterm connection, see the AccountEJB.java code.
In a session bean, a business method that connects to a database should be transactional. The transaction will help maintain data integrity.
1. Enter the coded name.
To enter the coded name in the bean's deployment descriptor, you run the Application Deployment Tool and step through the New Enterprise Bean Wizard. In the Coded Name field of the wizard's Resource References dialog box, you enter the database name from the bean's code. For example, the logical database name coded in the
AccountEJB class is the
jdbc/AccountDB portion of the following string:
In the Coded Name field of the wizard, you enterprivate String dbName = "java:comp/env/jdbc/AccountDB";
jdbc/AccountDB. In the Type column, select javax.sql.DataSource.
2. Map the coded name to the JNDI name.
The Application Deployment Tool allows you to map this information in two ways: in a deployment dialog box and in the JNDI Names tabbed pane of the J2EE application. If the
AccountEJB class connects to a Cloudscape database, for example, you enter
jdbc/Cloudscape in the JNDI Name field of the JNDI Names tabbed pane.
The J2EE server automatically enters the database JNDI names such as
jdbc/Cloudscape into the name space. The server obtains these JNDI
names from the
jdbc.datasources entry of the
config/default.properties file. The
entry maps the JNDI name to the URL of the database.
However, some types of databases do require a user and password during connection. For these databases, if the
getConnection call has no parameters, you must specify the database user and password with the Application Deployment Tool. To specify these values, click on the Resource Ref's tabbed pane of the enterprise bean, select the appropriate row in the table labelled, "Resource Factories Referenced in Code," and enter the database user name and password in the fields at the bottom.
If you wish to obtain the database user and password programmatically, you do not need to specify them with the Application Deployment Tool. In this case, you include the database user and password in the arguments of the
con = dataSource.getConnection(dbUser, dbPassword);
TOC | Index