Creating and configuring a JDBC provider and data source using the JMX API

If your application requires access to a Java Database Connectivity (JDBC) connection pool from a Java™ 2 Platform, Enterprise Edition (J2EE) 1.3 or 1.4, or Java Platform Enterprise Edition (Java EE) level WebSphere® Application Server component, you can create the necessary JDBC provider and data source objects using the Java Management Extensions (JMX) API exclusively.

About this task

Alternatively, you can use the JMX API in combination with the wsadmin scripting tool.
Best practice: If you are using the JMX API to create a data source, you should use one of the product-provided templates if one exists for your specific JDBC provider. The product provides a template for every supported JDBC provider. See the topic Data source minimum required settings, by vendor for a list of all of the supported JDBC providers. When you use the administrative console to select one of the provided templates, the administrative console prompts you for values for all of the required properties for that data source. See the topic, Configuring a JDBC provider and data source, for more information on how to use the administrative console to create a data source. If you decide to use the wsadmin scripting tool to create a data source, see the topic Data source minimum required settings, by vendor for a list of the required settings. bprac
These steps outline the general procedure for using the JMX API to create a JDBC provider and data source, on WebSphere Application Server running on Windows® platforms.

Procedure

  1. Put the appropriate JAR files in your classpath. You need the com.ibm.ws.admin.client_6.1.0.jar JAR file in your classpath.
    The following command is an example for setting your classpath:
    set classpath=%classpath%;install_root\runtime\com.ibm.ws.admin.client_6.1.0.jar
  2. Look up the host and get an administration client handle.
  3. Get a configuration service handle.
  4. Update the resource.xml file using the configuration service as wanted.
    1. Add a JDBC provider.
    2. Add the data source.
    3. Add the connection factory. This step is necessary only for data sources that must support container-managed persistence.
  5. Reload the resource.xml file to bind the newly created data source into the JNDI namespace. Perform this step if you want to use the newly created data source right away without restarting the application server.
    1. Locate the DataSourceConfigHelper MBean using the name.
    2. Put together the signature and parameters for the call.
    3. Invoke the reload() call.
  6. Attention: If you modify the class path or native library path of an existing JDBC provider, you must restart every application server within the scope of that JDBC provider for the new configuration to work. Otherwise, you receive a data source failure message.

Example

Example: Using the Java Management Extensions API to create a JDBC driver and data source for a CMP bean. This code sample demonstrates how to configure a JDBC provider and data source, designate the data source for use with CMP beans, set an authorization alias for the data source, and reload the Mbean to make configuration changes.

//
// "This program may be used, executed, copied, modified and distributed 
// without royalty for the purpose of developing, using, marketing, or 
// distributing."
//
// Product 5630-A36,  (C) COPYRIGHT International Business Machines 
// Corp., 2008
// All Rights Reserved * Licensed Materials - Property of IBM
//
import java.util.*;
import javax.sql.*;
import javax.transaction.*;
import javax.management.*;

import com.ibm.websphere.management.*;
import com.ibm.websphere.management.configservice.*;
import com.ibm.ws.exception.WsException;


/**
 * Creates a node scoped resource.xml entry for a DB2 XA data source.
 * The data source created is for CMP use.
 * 
 * Set the following for the program to run:
 * set classpath=%classpath%;install_root\runtime\com.ibm.ws.admin.client_6.1.0.jar
 * install_root/lib/bootstrap.jar;install_root/lib/j2ee.jar; 
 * install_root/plugins/com.ibm.ws.bootstrap_6.1.0.jar;install_root/plugins/com.ibm.ws.emf_2.1.0.jar; 
 * install_root/plugins/com.ibm.ws.runtime_6.1.0.jar;install_root/plugins/org.eclipse.emf.common_2.2.1.v200609210005.jar; 
 * install_root/plugins/org.eclipse.emf.ecore_2.2.1.v200609210005.jar; 
 */
public class CreateDataSourceCMP {

   String dsName = "markSection"; // the display name for the data source,
                                  // the JNDI name, and the connection factory name
   String dbName = "SECTION";     // the database name
   String authDataAlias = "db2admin"; // an authentication data alias
   String uid = "db2admin";           // user ID
   String pw  = "db2admin";           //  password
   String dbclasspath = "D:/SQLLIB/java/db2java.zip"; // path to the database driver




   /**
    * Main method.
    */
   public static void main(String[] args) {
      CreateDataSourceCMP cds = new CreateDataSourceCMP();

      try {
         cds.run(args);
      } catch (com.ibm.ws.exception.WsException ex) {
         System.out.println("Caught this " + ex   );
         ex.printStackTrace();
         //ex.getCause().printStackTrace();
      } catch (Exception ex) {
         System.out.println("Caught this " + ex );
         ex.printStackTrace();
      }
   }


   /**
    * This method creates the data source using JMX.
    * The data source created here is only written into resources.xml. 
    * It is not bound into namespace until the server is restarted or 
    * an application is started
    */
   public void run(String[] args) throws Exception {

      try {
         // Initialize the AdminClient.
         // Specify the SOAP_CONNECTOR_ADDRESS port of your server configuration.
         Properties adminProps = new Properties();
         adminProps.setProperty(AdminClient.CONNECTOR_TYPE, +
          AdminClient.CONNECTOR_TYPE_SOAP);
         adminProps.setProperty(AdminClient.CONNECTOR_HOST, "localhost");
         adminProps.setProperty(AdminClient.CONNECTOR_PORT, "8880");
         AdminClient adminClient = +
              AdminClientFactory.createAdminClient(adminProps);

         // Get the ConfigService implementation.			
         com.ibm.websphere.management.configservice.ConfigServiceProxy
           configService =
         new com.ibm.websphere.management.configservice.ConfigServiceProxy(adminClient);

         Session session = new Session();

         // Use this group to add to the node scoped resource.xml.
         ObjectName node1 = ConfigServiceHelper.createObjectName(null,"Node",
            null);
         ObjectName[] matches = configService.queryConfigObjects(session, null,
            node1, null);
         node1 = matches[0];     // use the first node found

         // Use this group to add to the server1 scoped resource.xml.
         ObjectName server1 = ConfigServiceHelper.createObjectName(null,
                 "Server", "server1");
         matches = configService.queryConfigObjects(session, null, server1,
                null);
         server1 = matches[0];   // use the first server found

         // Create the JDBCProvider
         String providerName = "DB2 JDBC Provider (XA)";
         System.out.println("Creating JDBCProvider " + providerName );

         // Prepare the attribute list
         AttributeList provAttrs = new AttributeList();
         provAttrs.add(new Attribute("name", providerName));
         provAttrs.add(new Attribute("implementationClassName",
                 "com.ibm.db2.jdbc.DB2XADataSource"));
         provAttrs.add(new Attribute("description","DB2 JDBC2-compliant
                  + XA Driver"));

         //create the provider 
         ObjectName jdbcProv = configService.createConfigData(session,node1,
               "JDBCProvider", "JDBCProvider",provAttrs);
         // now plug in the classpath
         configService.addElement(session,jdbcProv,"classpath",dbclasspath,-1);


         // Search for RRA so we can link it to the data source 
         ObjectName rra = null;
         ObjectName j2cra = ConfigServiceHelper.createObjectName(null, "J2CResourceAdapter", null);
         matches = configService.queryConfigObjects(session, node1, j2cra, null);
         for (int i = 0; i < matches.length; i++) {
           if ( matches[i].getKeyProperty("_Websphere_Config_Data_Display_Name").equals("WebSphere Relational 
             Resource Adapter") ) {
             rra = matches[i];
             break;
           }
         }

         // Prepare the attribute list
         AttributeList dsAttrs = new AttributeList();
         dsAttrs.add(new Attribute("name", dsName));
         dsAttrs.add(new Attribute("jndiName", "jdbc/" + dsName));
         dsAttrs.add(new Attribute("datasourceHelperClassname",
              "com.ibm.websphere.rsadapter.DB2DataStoreHelper"));
         dsAttrs.add(new Attribute("statementCacheSize", new Integer(10)));
         dsAttrs.add(new Attribute("relationalResourceAdapter", rra)); 
         // this is where we make the link to "builtin_rra"
         dsAttrs.add(new Attribute("description", "JDBC data source for
              + mark section CMP 2.0 test"));
         dsAttrs.add(new Attribute("authDataAlias",authDataAlias));

         // Create the data source
         System.out.println("  **  Creating data source");
         ObjectName dataSource = 
             configService.createConfigData(session,jdbcProv,"DataSource",
                "DataSource",dsAttrs);

         // Add a propertySet.
         AttributeList propSetAttrs = new AttributeList();
         ObjectName resourcePropertySet =
           configService.createConfigData(session,dataSource,"propertySet",
                "",propSetAttrs);

         // Add resourceProperty databaseName
         AttributeList propAttrs1 = new AttributeList();
         propAttrs1.add(new Attribute("name", "databaseName"));
         propAttrs1.add(new Attribute("type", "java.lang.String"));
         propAttrs1.add(new Attribute("value", dbName));

         configService.addElement(session,resourcePropertySet,
              "resourceProperties",propAttrs1,-1);


         // Create the corresponding J2CResourceAdapter Connection Factory object.
         ObjectName jra = ConfigServiceHelper.createObjectName(null,
             "J2CResourceAdapter",null);

         // Get all the J2CResourceAdapter, and add the data source 
         System.out.println("  **  Get all J2CResourceAdapters");
         ObjectName[] jras = configService.queryConfigObjects(session, node1,
               jra, null);

         int i=0;

         for (;i< jras.length;i++) {
            System.out.println(ConfigServiceHelper.getConfigDataType(jras[i])
                    + " " + i + " = " 
                    + jras[i].getKeyProperty(SystemAttributes.
                    + _WEBSPHERE_CONFIG_DATA_DISPLAY_NAME)
                    + "\nFrom scope =" 
                    + jras[i].getKeyProperty(SystemAttributes.
                    + _WEBSPHERE_CONFIG_DATA_ID));
            // quit on the first builtin_rra
            if (jras[i].getKeyProperty(SystemAttributes.
                               + _WEBSPHERE_CONFIG_DATA_DISPLAY_NAME)
                .equals("WebSphere Relational Resource Adapter")) {
               break;
            }
         }


         if (i >= jras.length) { 
            System.out.println("Did not find builtin_rra; the J2CResourceAdapter object is
               + creating connection factory anyway" );
            break; 
         } else { 
            System.out.println("Found builtin_rra J2CResourceAdapter object at index 
               + " + i + " creating connection factory" );
         }

         // Prepare the attribute list
         AttributeList cfAttrs = new AttributeList();
         cfAttrs.add(new Attribute("name", dsName + "_CF"));
         cfAttrs.add(new Attribute("authMechanismPreference","BASIC_PASSWORD"));
         cfAttrs.add(new Attribute("authDataAlias",authDataAlias));
         cfAttrs.add(new Attribute("cmpDatasource", dataSource ));  
         // Make the link to data source's xmi:id
         ObjectName cf = configService.createConfigData(session,jras[i],
            "CMPConnectorFactory", "CMPConnectorFactory",cfAttrs);


         // ===== start Security section
         System.out.println("Creating an authorization data alias " + authDataAlias);

         // Find the parent security object
         ObjectName security = ConfigServiceHelper.createObjectName(null, 
             "Security", null);
         ObjectName[] securityName = configService.queryConfigObjects(session,
             null, security, null);
         security=securityName[0];

         // Prepare the attribute list
         AttributeList authDataAttrs = new AttributeList();
         authDataAttrs.add(new Attribute("alias", authDataAlias));
         authDataAttrs.add(new Attribute("userId", uid));
         authDataAttrs.add(new Attribute("password", pw));
         authDataAttrs.add(new Attribute("description","Auto created alias for data source"));

         //create it 
         ObjectName authDataEntry = configService.createConfigData(session,security,"authDataEntries",
				    "JAASAuthData",authDataAttrs);
         // ===== end Security section

         // Save the session
         System.out.println("Saving session" );
         configService.save(session, false);

         // reload resources.xml
         reload(adminClient,true);
      } catch (Exception ex) {
         ex.printStackTrace(System.out);
         throw ex;
      }
   }

   /**
    * Get the DataSourceConfigHelperMbean and call reload() on it
    * 
    * @param adminClient
    * @param verbose true - print messages to stdout
    */
   public void reload(AdminClient adminClient,boolean verbose) {
      if (verbose) {
         System.out.println("Finding the Mbean to call reload()");
      }

      // First get the  Mbean
      ObjectName handle = null;
      try {
         ObjectName queryName = new ObjectName("WebSphere:type=DataSourceCfgHelper,*");
         Set s = adminClient.queryNames(queryName, null);
         Iterator iter = s.iterator();
         if (iter.hasNext()) handle = (ObjectName)iter.next();
      } catch (MalformedObjectNameException mone) {
         System.out.println("Check the program variable queryName" + mone);
      } catch (com.ibm.websphere.management.exception.ConnectorException ce) {
         System.out.println("Cannot connect to the application server" + ce);
      }

      if (verbose) {
         System.out.println("Calling reload()");
      }
      Object result = null;
      try {
         result = adminClient.invoke(handle, "reload", new Object[] {}, new String[] {});
      } catch (MBeanException mbe) {
         if (verbose) {
            System.out.println("\tMbean Exception calling reload" + mbe);
         }
      } catch (InstanceNotFoundException infe) {
         System.out.println("Cannot find reload ");
      } catch (Exception ex) {
         System.out.println("Exception occurred calling reload()" + ex);
      }

      if (result==null && verbose) {
         System.out.println("OK reload()");
      }
   }
}

Example: Using the Java Management Extensions API to create a JDBC driver and data source for BMP beans, session beans, or servlets. This code sample demonstrates how to configure a JDBC provider and data source, set an authorization alias for the data source, and reload the Mbean to make configuration changes.

// "This program may be used, run, copied, modified and distributed without royalty for the 
// purpose of developing, using, marketing, or distributing."
//
// Product 5630-A36,  (C) COPYRIGHT International Business Machines Corp., 2001, 2002
// All Rights Reserved * Licensed Materials - Property of IBM
//
import java.util.*;
import javax.sql.*;
import javax.transaction.*;
import javax.management.*;

import com.ibm.websphere.management.*;
import com.ibm.websphere.management.configservice.*;
import com.ibm.ws.exception.WsException;


/**
 * Creates a node scoped resource.xml entry for a DB2® XA datasource.
 * The datasource created is for BMP use.
 * 
 * Set the following:
 * set classpath=%classpath%;install_root/lib/bootstrap.jar;install_root/lib/j2ee.jar;
 * install_root/plugins/com.ibm.ws.bootstrap_6.1.0.jar;install_root/plugins/com.ibm.ws.emf_2.1.0.jar;
 * install_root/plugins/com.ibm.ws.runtime_6.1.0.jar;install_root/plugins/org.eclipse.emf.common_2.2.1.v200609210005.jar;
 * install_root/plugins/org.eclipse.emf.ecore_2.2.1.v200609210005.jar;install_root/runtime/com.ibm.ws.admin.client_6.1.0.jar;
 */
public class CreateDataSourceBMP {

   String dsName = "markSection"; // the display name of the datasource
                                  // this is also the JNDI name and the connection factory
   String dbName = "SECTION";     // database name
   String authDataAlias = "db2admin"; // an authentication data alias
   String uid = "db2admin";           // user ID
   String pw  = "db2admin";           //  password
   String dbclasspath = "D:/SQLLIB/java/db2java.zip"; // path to the database driver




   /**
    * Main method.
    */
   public static void main(String[] args) {
      CreateDataSourceBMP cds = new CreateDataSourceBMP();

      try {
         cds.run(args);
      } catch (com.ibm.ws.exception.WsException ex) {
         System.out.println("Caught this " + ex   );
         ex.printStackTrace();
         //ex.getCause().printStackTrace();
      } catch (Exception ex) {
         System.out.println("Caught this " + ex );
         ex.printStackTrace();
      }
   }


   /**
    * This method creates the datasource using JMX. 
    * 
    * The datasource created here is only written into resources.xml. 
    * It is not bound into namespace until the server is restarted or an
    * application is started
    */
   public void run(String[] args) throws Exception {

      try {
         // Initialize the AdminClient.
         // Specify the SOAP_CONNECTOR_ADDRESS port of your server configuration.
         Properties adminProps = new Properties();
         adminProps.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP);
         adminProps.setProperty(AdminClient.CONNECTOR_HOST, "localhost");
         adminProps.setProperty(AdminClient.CONNECTOR_PORT, "8880");
         AdminClient adminClient = AdminClientFactory.createAdminClient(adminProps);

         // Get the ConfigService implementation.			
         com.ibm.websphere.management.configservice.ConfigServiceProxy configService =
         new com.ibm.websphere.management.configservice.ConfigServiceProxy(adminClient);

         Session session = new Session();

         // Use this group to add to the node-scoped resource.xml.
         ObjectName node1 = ConfigServiceHelper.createObjectName(null, "Node", null);
         ObjectName[] matches = configService.queryConfigObjects(session, null, node1, null);
         node1 = matches[0];     // use the first node found

         // Use this group to add to the server1 scoped resource.xml.
         ObjectName server1 = ConfigServiceHelper.createObjectName(null, "Server", "server1");
         matches = configService.queryConfigObjects(session, null, server1, null);
         server1 = matches[0];   // use the first server found

         // Create the JDBCProvider
         String providerName = "DB2 JDBC Provider (XA)";
         System.out.println("Creating JDBCProvider " + providerName );

         // Prepare the attribute list
         AttributeList provAttrs = new AttributeList();
         provAttrs.add(new Attribute("name", providerName));
         provAttrs.add(new Attribute("implementationClassName", "com.ibm.db2.jdbc.DB2XADataSource"));
         provAttrs.add(new Attribute("description","DB2 JDBC2-compliant XA Driver"));

         //create it 
         ObjectName jdbcProv = configService.createConfigData(session,node1,"JDBCProvider",
				"JDBCProvider", provAttrs);
         // now add the classpath
         configService.addElement(session,jdbcProv,"classpath",dbclasspath,-1);



         // Search for RRA so we can link it to the datasource 
         ObjectName rra = null;
         ObjectName j2cra = ConfigServiceHelper.createObjectName(null, "J2CResourceAdapter", null);
         matches = configService.queryConfigObjects(session, node1, j2cra, null);
         for (int i = 0; i < matches.length; i++) {
              if ( matches[i].getKeyProperty("_Websphere_Config_Data_Display_Name").equals("WebSphere Relational 
                Resource Adapter") ) {
                rra = matches[i];
                break;
              }
            }

       
         // Prepare the attribute list
         AttributeList dsAttrs = new AttributeList();
         dsAttrs.add(new Attribute("name", dsName));
         dsAttrs.add(new Attribute("jndiName", "jdbc/" + dsName));
         dsAttrs.add(new Attribute("datasourceHelperClassname","com.ibm.websphere.rsadapter.DB2DataStoreHelper"));
         dsAttrs.add(new Attribute("statementCacheSize", new Integer(10)));
         dsAttrs.add(new Attribute("relationalResourceAdapter", rra)); 
				// Make the link to "builtin_rra"
         dsAttrs.add(new Attribute("description", "JDBC Datasource for mark section CMP 2.0 test"));
         dsAttrs.add(new Attribute("authDataAlias",authDataAlias));

         // Create the data source
         System.out.println("  **  Creating datasource");
         ObjectName dataSource = configService.createConfigData(session,jdbcProv,"DataSource",
			   	"resources.jdbc:DataSource",dsAttrs);

         // Add a propertySet.
         AttributeList propSetAttrs = new AttributeList();
         ObjectName resourcePropertySet =configService.createConfigData(session,dataSource,
			   	"propertySet","",propSetAttrs);

         // Add resourceProperty databaseName
         AttributeList propAttrs1 = new AttributeList();
         propAttrs1.add(new Attribute("name", "databaseName"));
         propAttrs1.add(new Attribute("type", "java.lang.String"));
         propAttrs1.add(new Attribute("value", dbName));

         configService.addElement(session,resourcePropertySet,"resourceProperties",propAttrs1,-1);


         // ===== start Security section
         System.out.println("Creating an authorization data alias " + authDataAlias);

         // Find the parent security object
         ObjectName security = ConfigServiceHelper.createObjectName(null, "Security", null);
         ObjectName[] securityName = configService.queryConfigObjects(session, null, security, null);
         security=securityName[0];

         // Prepare the attribute list
         AttributeList authDataAttrs = new AttributeList();
         authDataAttrs.add(new Attribute("alias", authDataAlias));
         authDataAttrs.add(new Attribute("userId", uid));
         authDataAttrs.add(new Attribute("password", pw));
         authDataAttrs.add(new Attribute("description","Auto created alias for datasource"));

         //create it 
         ObjectName authDataEntry = configService.createConfigData(session,security,"authDataEntries",
				   "JAASAuthData",authDataAttrs);
         // ===== end Security section

         // Save the session
         System.out.println("Saving session" );
         configService.save(session, false);

         // reload resources.xml
         reload(adminClient,true);

      } catch (Exception ex) {
         ex.printStackTrace(System.out);
         throw ex;
      }
   }

   /**
    * Get the DataSourceConfigHelperMbean and call reload() on it
    * 
    * @param adminClient
    * @param verbose true - print messages to stdout
    */
   public void reload(AdminClient adminClient,boolean verbose) {
      if (verbose) {
         System.out.println("Finding the Mbean to call reload()");
      }

      // First get the  Mbean
      ObjectName handle = null;
      try {
         ObjectName queryName = new ObjectName("WebSphere:type=DataSourceCfgHelper,*");
         Set s = adminClient.queryNames(queryName, null);
         Iterator iter = s.iterator();
         if (iter.hasNext()) handle = (ObjectName)iter.next();
      } catch (MalformedObjectNameException mone) {
         System.out.println("Check the program variable queryName" + mone);
      } catch (com.ibm.websphere.management.exception.ConnectorException ce) {
         System.out.println("Cannot connect to the application server" + ce);
      }

      if (verbose) {
         System.out.println("Calling reload()");
      }
      Object result = null;
      try {
         result = adminClient.invoke(handle, "reload", new Object[] {}, new String[] {});
      } catch (MBeanException mbe) {
         if (verbose) {
            System.out.println("\tMbean Exception calling reload" + mbe);
         }
      } catch (InstanceNotFoundException infe) {
         System.out.println("Cannot find reload ");
      } catch (Exception ex) {
         System.out.println("Exception occurred calling reload()"  + ex);
      }

      if (result==null && verbose) {
         System.out.println("OK reload()");
      }
   }
}



In this information ...


Related concepts

IBM Redbooks, demos, education, and more

(Index)

Use IBM Suggests to retrieve related content from ibm.com and beyond, identified for your convenience.

This feature requires Internet access.

Task topic    

Terms of Use | Feedback

Last updated: Oct 20, 2010 7:53:43 PM CDT
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=compass&product=was-nd-dist&topic=cjmxapis
File name: tdat_cjmxapis.html