Example: Developing session bean with container managed transaction
//===================START_PROLOG====================================== // // 5630-A23, 5630-A22, // (C) COPYRIGHT International Business Machines Corp. 2002 // All Rights Reserved // Licensed Materials - Property of IBM // US Government Users Restricted Rights - Use, duplication or // disclosure restricted by GSA ADP Schedule Contract with IBM Corp. // // IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING // ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR // CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF // USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR // OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE // OR PERFORMANCE OF THIS SOFTWARE. // //===================END_PROLOG======================================== package WebSphereSamples.ConnPool; import java.rmi.RemoteException; import java.util.*; import java.sql.*; import javax.sql.*; import javax.ejb.*; import javax.naming.*; /************************************************************************************* * This bean is designed to demonstrate Database Connections in a * Container Managed Transaction Session Bean. Its transaction attribute * * should be set to TX_REQUIRED or TX_REQUIRES_NEW. * ************************************************************************************** */ public class ShowEmployeesCMTBean implements SessionBean { private javax.ejb.SessionContext mySessionCtx = null; final static long serialVersionUID = 3206093459760846163L; private javax.sql.DataSource ds; //************************************************************************************ //* ejbActivate calls the getDS method, which does the JNDI lookup for the DataSource. //* Because the DataSource lookup is in a separate method, we can also invoke it from //* the getEmployees method in the case where the DataSource field is null. //************************************************************************************ public void ejbActivate() throws java.rmi.RemoteException { getDS(); } /** * ejbCreate method * @exception javax.ejb.CreateException * @exception java.rmi.RemoteException */ public void ejbCreate() throws javax.ejb.CreateException, java.rmi.RemoteException {} /** * ejbPassivate method * @exception java.rmi.RemoteException */ public void ejbPassivate() throws java.rmi.RemoteException {} /** * ejbRemove method * @exception java.rmi.RemoteException */ public void ejbRemove() throws java.rmi.RemoteException {} //************************************************************************************ //* The getEmployees method runs the database query to retrieve the employees. //* The getDS method is only called if the DataSource variable is null. //* Because this session bean uses Container Managed Transactions, it cannot retry the //* transaction on a StaleConnectionException. However, it can throw an exception to //* its client indicating that the operation is retriable. * //************************************************************************************ public Vector getEmployees() throws com.ibm.ejs.cm.pool.ConnectionWaitTimeoutException, SQLException, RetryableConnectionException { Connection conn = null; Statement stmt = null; ResultSet rs = null; Vector employeeList = new Vector(); if (ds == null) getDS(); try { // Get a Connection object conn using the DataSource factory. conn = ds.getConnection(); // Run DB query using standard JDBC coding. stmt = conn.createStatement(); String query = "Select FirstNme, MidInit, LastName " + "from Employee ORDER BY LastName"; rs = stmt.executeQuery(query); while (rs.next()) { employeeList.addElement(rs.getString(3) + ", " + rs.getString(1) + " " + rs.getString(2)); } } catch (com.ibm.websphere.ce.cm.StaleConnectionException se) { // This exception indicates that the connection to the database is no longer valid. // Rollback the transaction, and throw an exception to the client indicating they // can retry the transaction if desired. System.out.println("Stale Connection Exception during get connection or process SQL: " + se.getMessage()); System.out.println("Rolling back transaction and throwing RetryableConnectionException"); mySessionCtx.setRollbackOnly(); throw new RetryableConnectionException(se.toString()); } catch (com.ibm.ejs.cm.pool.ConnectionWaitTimeoutException cw) { // This exception is thrown if a connection can not be obtained from the // pool within a configurable amount of time. Frequent occurrences of // this exception indicate an incorrectly tuned connection pool System.out.println("Connection Wait Timeout Exception during get connection or process SQL: " + cw.getMessage()); throw cw; } catch (SQLException sq) { //Throwing a remote exception will automatically roll back the container managed //transaction System.out.println("SQL Exception during get connection or process SQL: " + sq.getMessage()); throw sq; } finally { // Always close the connection in a finally statement to ensure proper // closure in all cases. Closing the connection does not close and // actual connection, but releases it back to the pool for reuse. if (rs != null) { try { rs.close(); } catch Exception(e) { System.out.println("Close Resultset Exception: " + e.getMessage()); } } if (stmt != null) { try { stmt.close(); } catch Exception(e) { System.out.println("Close Statement Exception: " + e.getMessage()); } } if (conn != null) { try { conn.close(); } catch Exception(e) { System.out.println("Close connection exception: " + e.getMessage()); } } } return employeeList; } /** * getSessionContext method * @return javax.ejb.SessionContext */ public javax.ejb.SessionContext getSessionContext() { return mySessionCtx; } //************************************************************************************ //* The getDS method performs the JNDI lookup for the DataSource. * //* This method is called from ejbActivate, and from getEmployees if the DataSource //* object is null. * //************************************************************************************ private void getDS() { try { // Note the new Initial Context Factory interface available in WebSphere 4.0 Hashtable parms = new Hashtable(); parms.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"); InitialContext ctx = new InitialContext(parms); // Perform a naming service lookup to get the DataSource object. ds = (DataSource)ctx.lookup("java:comp/env/jdbc/SampleDB"); } catch Exception(e) { System.out.println("Naming service exception: " + e.getMessage()); e.printStackTrace(); } } /** * setSessionContext method * @param ctx javax.ejb.SessionContext * @exception java.rmi.RemoteException */ public void setSessionContext(javax.ejb.SessionContext ctx) throws java.rmi.RemoteException { mySessionCtx = ctx; } }
//===================START_PROLOG====================================== // // 5630-A23, 5630-A22, // (C) COPYRIGHT International Business Machines Corp. 2002 // All Rights Reserved // Licensed Materials - Property of IBM // US Government Users Restricted Rights - Use, duplication or // disclosure restricted by GSA ADP Schedule Contract with IBM Corp. // // IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING // ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR // CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF // USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR // OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE // OR PERFORMANCE OF THIS SOFTWARE. // //===================END_PROLOG======================================== package WebSphereSamples.ConnPool; /** * This is a Home interface for the Session Bean */ public interface ShowEmployeesCMTHome extends javax.ejb.EJBHome { /** * create method for a session bean * @return WebSphereSamples.ConnPool.ShowEmployeesCMT * @exception javax.ejb.CreateException * @exception java.rmi.RemoteException */ WebSphereSamples.ConnPool.ShowEmployeesCMT create() throws javax.ejb.CreateException, java.rmi.RemoteException; }
//===================START_PROLOG====================================== // // 5630-A23, 5630-A22, // (C) COPYRIGHT International Business Machines Corp. 2002 // All Rights Reserved // Licensed Materials - Property of IBM // US Government Users Restricted Rights - Use, duplication or // disclosure restricted by GSA ADP Schedule Contract with IBM Corp. // // IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING // ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR // CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF // USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR // OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE // OR PERFORMANCE OF THIS SOFTWARE. // //===================END_PROLOG======================================== package WebSphereSamples.ConnPool; /** * This is an Enterprise Java Bean Remote Interface */ public interface ShowEmployeesCMT extends javax.ejb.EJBObject { /** * * @return java.util.Vector */ java.util.Vector getEmployees() throws java.sql.SQLException, java.rmi.RemoteException, com.ibm.ejs.cm.pool.ConnectionWaitTimeoutException, WebSphereSamples.ConnPool.RetryableConnectionException; }
//===================START_PROLOG====================================== // // 5630-A23, 5630-A22, // (C) COPYRIGHT International Business Machines Corp. 2002 // All Rights Reserved // Licensed Materials - Property of IBM // US Government Users Restricted Rights - Use, duplication or // disclosure restricted by GSA ADP Schedule Contract with IBM Corp. // // IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING // ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR // CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF // USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR // OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE // OR PERFORMANCE OF THIS SOFTWARE. // //===================END_PROLOG======================================== package WebSphereSamples.ConnPool; /** * Exception indicating that the operation can be retried * Creation date: (4/2/2001 10:48:08 AM) * @author: Administrator */ public class RetryableConnectionException extends Exception { /** * RetryableConnectionException constructor. */ public RetryableConnectionException() { super(); } /** * RetryableConnectionException constructor. * @param s java.lang.String */ public RetryableConnectionException String(s) { super(s); } }