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.
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, 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., 2008 // All Rights Reserved * Licensed Materials - Property of IBM // import java.util.*; import javax.sql.*; import javax.transaction.*; import javax.management.*; import java.io.*; import com.ibm.websphere.management.*; import com.ibm.websphere.management.configservice.*; import com.ibm.ws.management.*; import com.ibm.ws.exception.*; /** * Creates a node-scoped resource.xml entry for a * DB2 for zOS Local JDBC Provider (RRS) data source * when WebSphere security is not enabled * * The data source created is for CMP use. * * To run this example, the following must be done: * * 1) Set the WAS_HOME environment variable to the location of * your WebSphere Application Server for z/OS Configuration * directory * * Example: export WAS_HOME=/install_root * * 2) Set the following environment variables: * * export WAS_LIB=$WAS_HOME/lib * export WAS_CLASSPATH=[DIRECTORY_CONTAINING_THIS_FILE] * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_LIB/admin.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_LIB/bootstrap.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_LIB/j2ee.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_LIB/jmxc.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/java/jre/lib/ext/mail.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/plugins/com.ibm.ws.bootstrap_6.1.0.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/plugins/com.ibm.ws.emf_2.1.0.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/plugins/com.ibm.ws.runtime_6.1.0.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/plugins/org.eclipse.emf.common_2.2.1.v200609210005.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/plugins/org.eclipse.emf.ecore_2.2.1.v200609210005.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/runtime/admin.client_6.1.0.jar * * 3) Execute the following commands: * * javac -classpath $WAS_CLASSPATH CreateDataSourceCMP.java * java -classpath $WAS_CLASSPATH CreateDataSourceCMP */ public class CreateDataSourceCMP { String dsName = "MyDataSourceCMP"; // the data source display name // this is also the JNDI name and connection factory name String dbName = "LOC1"; // database name String authDataAlias = "IBMUSER"; // an authentication data alias String uid = "IBMUSER"; // user ID String pw = "IBMUSER"; // password String dbclasspath = "/db2beta/db2710/classes/db2j2classes.zip"; // path to the database driver String dblibpath = "/db2beta/db2710/lib"; // path to the native library directory for the database /** * 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 = "My DB2 for zOS Local JDBC Provider (RRS) for CMP"; 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.jcc.DB2ConnectionPoolDataSource")); provAttrs.add(new Attribute("description","Legacy DB2 for z/OS driver using RRS")); //create it ObjectName jdbcProv = configService.createConfigData(session,node1,"JDBCProvider", "JDBCProvider", provAttrs); // now plug in the classpath configService.addElement(session,jdbcProv,"classpath",dbclasspath,-1); configService.addElement(session,jdbcProv,"nativepath",dblibpath,-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 CMP usage")); dsAttrs.add(new Attribute("authDataAlias", authDataAlias)); // Create the data source System.out.println(" ** Creating data source"); 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); // Now Create the corresponding J2CResourceAdapter Connection // Factory object. ObjectName jra = ConfigServiceHelper.createObjectName(null, "J2CResourceAdapter",null); // Get all the J2CResourceAdapter, and I want to add my 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 the 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 to bind the new data source into the name // space 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® for zOS Local JDBC Provider (RRS) DataSource * when WebSphere security is not enabled * * To run this example, the following must be done: * * 1) Set the WAS_HOME environment variable to the location of * your WebSphere Application Server for z/OS® Configuration * directory * * Example: export WAS_HOME=install_root * * 2) Set the following environment variables: * * export WAS_LIB=$WAS_HOME/lib * export WAS_CLASSPATH=[DIRECTORY_CONTAINING_THIS_FILE] * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_LIB/admin.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_LIB/bootstrap.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_LIB/j2ee.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_LIB/jmxc.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/java/jre/lib/ext/mail.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/plugins/com.ibm.ws.bootstrap_6.1.0.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/plugins/com.ibm.ws.emf_2.1.0.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/plugins/com.ibm.ws.runtime_6.1.0.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/plugins/org.eclipse.emf.common_2.2.1.v200609210005.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/plugins/org.eclipse.emf.ecore_2.2.1.v200609210005.jar * export WAS_CLASSPATH=$WAS_CLASSPATH:$WAS_HOME/runtime/admin.client_6.1.0.jar * * 3) Run the following commands: * * javac -classpath $WAS_CLASSPATH CreateDataSourceBMP.java * java -classpath $WAS_CLASSPATH CreateDataSourceBMP */ public class CreateDataSourceBMP { String dsName = "MyDataSourceBMP"; // Data source display name // this is also the JNDI name and connection factory name String dbName = "LOC1"; // database name String authDataAlias = "IBMUSER"; // an authentication data alias String uid = "IBMUSER"; // user ID String pw = "IBMUSER"; // password String dbclasspath = "/db2beta/db2710/classes/db2j2classes.zip"; // path to the database driver String dblibpath = "/db2beta/db2710/lib"; // path to the native library directory for the database /** * 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(); } 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 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 = "My DB2 for zOS Local JDBC Provider (RRS) for BMP"; 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.jcc.DB2ConnectionPoolDataSource")); provAttrs.add(new Attribute("description","Legacy DB2 for z/OS driver using RRS")); //create it ObjectName jdbcProv = configService.createConfigData(session,node1,"JDBCProvider", "JDBCProvider", provAttrs); // now add the classpath configService.addElement(session,jdbcProv,"classpath",dbclasspath,-1); configService.addElement(session,jdbcProv,"nativepath",dblibpath,-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)); // this is where we make the // link to "builtin_rra" dsAttrs.add(new Attribute("description", "JDBC Datasource for BMP usage")); dsAttrs.add(new Attribute("authDataAlias",authDataAlias)); // Create the datasource 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 tasks
| IBM Redbooks, demos, education, and more(Index) |