Oracle DBA Tips Corner |
Data Sources and OC4J
by Jeff Hunter, Sr. Database Administrator
Overview
Applications deployed to the OC4J application server (and even those that exist outside of the application server) can use a data source object to connect to a database. This article provides an overview on how to configure and test a data source in the OC4J application server. I will then create a simple Java client application that exists outside of the OC4J application server to connect to an Oracle database.
Data Source Overview in OC4J
A data source is a Java object that has the attributes and methods specified in the javax.sql.DataSource interface. It is a factory for java.sql.Connection objects. In almost all cases, an object that implements the DataSource interface will register itself with a JNDI service.
Configuring Data Sources in OC4J
Configuring data sources in OC4J is done through the file data-sources.xml. This file is located in $OC4J_HOME/j2ee/home/config directory. Keep in mind that this does not uses or configure any connection pooling. Add the following entry to your data-sources.xml file. Change the host:port:SID in the url to your own connection information:<data-source class="com.evermind.sql.DriverManagerDataSource" name="OracleTestDS" location="jdbc/OracleTestDS" xa-location="jdbc/xa/OracleTestXADS" ejb-location="jdbc/OracleTestDS" connection-driver="oracle.jdbc.driver.OracleDriver" username="scott" password="tiger" url="jdbc:oracle:thin:@linux1:1521:ORCL1" inactivity-timeout="30" />
NOTE: After modifying the data-sources.xml file, you must restart the OC4J application server.
NOTE: This article provides the details on how to configure a data source using the standalone version of OC4J. If you are using Oracle9iAS, you should use Enterprise Manager(EM) to create and configure data sources.
Example Database Client Java Program
In this section, I will present a complete Java client program that can be used to lookup an OC4J data source. This is an application that will exist outside of the OC4J application server (an application not deployed to the OC4J application server) that will use JNDI to lookup an OC4J data source, acquire a Connection object, connect to and query from an Oracle database.Setting the CLASSPATH
set CLASSPATH=.;C:\JDeveloper\j2ee\home\oc4j.jar
Compile the Java Client Program
javac DataSourceClient.java
Run the Program
java DataSourceClient Initial Context : javax.naming.InitialContext@64dc11 Data Source : com.evermind.sql.OrionCMTDataSource@10655dd Connection : [Connection : com.evermind.sql.OrionCMTConnection@1d7ad1c] User : SCOTT Date / Time : 22-MAY-2004 16:02:55
DataSourceClient.java // ----------------------------------------------------------------------------- // DataSourceClient.java // ----------------------------------------------------------------------------- import javax.naming.InitialContext; import javax.naming.Context; import javax.naming.NamingException; import java.sql.Connection; import java.sql.Statement; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import java.util.Hashtable; /** * This is a simple Java client that can be used to lookup a J2EE data source * in OC4J. Once the data source is acquired, it will be used to get a * Connection object to connect to a database. * * @author Jeffrey Hunter, Sr. Database Administrator * @author <a href="mailto:jhunter@iDevelopment.info">jhunter@iDevelopment.info</a> * @author <a target="_blank" href="http://www.iDevelopment.info">www.iDevelopment.info</a> * @version 1.0, 17-MAY-2004 * @since SDK1.4 */ public class DataSourceClient { public static void main(String[] args) { Statement stmt = null; ResultSet rset = null; String queryString = null; try { // STEP 1: Create a Hashtable object for JNDI Connection Hashtable env = new Hashtable(); // STEP 2: Configure all JNDI properties env.put( Context.INITIAL_CONTEXT_FACTORY , "com.evermind.server.rmi.RMIInitialContextFactory"); env.put(Context.SECURITY_PRINCIPAL, "admin"); env.put(Context.SECURITY_CREDENTIALS, "manager"); env.put(Context.PROVIDER_URL, "ormi://localhost:23791"); // STEP 3: Create the context object using the JNDI env object Context ctx = new InitialContext(env); System.out.println("Initial Context : " + ctx); // STEP 4: Look up the OC4J data source object DataSource ds = (DataSource)ctx.lookup("jdbc/OracleTestDS"); System.out.println("Data Source : " + ds); // STEP 5: Now, acquire a Connection object and connect to the // Oracle database. Connection conn = ds.getConnection(); System.out.println("Connection : " + conn + "\n"); // STEP 6: Use the Connection object to query from the database. queryString = "SELECT " + " user " + " , TO_CHAR(sysdate, 'DD-MON-YYYY HH24:MI:SS') " + "FROM dual"; stmt = conn.createStatement(); rset = stmt.executeQuery(queryString); int counter = 0; while (rset.next()) { System.out.println("User : " + rset.getString(1)); System.out.println("Date / Time : " + rset.getString(2)); } rset.close(); stmt.close(); } catch (SQLException e) { System.out.println("SQL Exception"); e.printStackTrace(); } catch (NamingException e) { System.out.println("Naming Exception"); e.printStackTrace(); } } }
Emulated and Non-Emulated Data Sources
Emulated datasource - The pre-installed default data source is an emulated data source. Emulated data sources are wrappers around Oracle data sources. Used primarily by applications that access only a single database.Non-emulated datasource - Non-emulated data sources are pure Oracle data sources. Used by applications that want to coordinate access to multiple sessions within the same database or to multiple databases within a global transaction.
All articles, scripts and material located at the Internet address of http://www.idevelopment.info is the copyright of Jeffrey M. Hunter
and is protected under copyright laws of the United States. This document may not be hosted on any other site without my express,
prior, written permission. Application to host any of the material elsewhere can be made by contacting me at jhunter@idevelopment.info.
I have made every effort and taken great care in making sure that the material included on my web site is technically accurate,
but I disclaim any and all responsibility for any loss, damage or destruction of data or any other property which may arise from
relying on it. I will in no case be liable for any monetary damages arising from such loss, damage or destruction.