Creación y configuración de un proveedor de JDBC y un origen de datos mediante la API de JMX

Si la aplicación requiere acceso a una base de datos relacional mediante la API de JDBC (Java™ Database Connectivity), puede crear los objetos de origen de datos y el proveedor de JDBC necesarios exclusivamente con la API de JMX (Java Management Extensions). Como alternativa, puede utilizar la API de JMX junto con la herramienta de scripts wsadmin.

Acerca de esta tarea

Best practice Best practice: Si utiliza la API JMX para crear un origen de datos, debe utilizar unas de las plantillas proporcionadas por el producto si existe una para el proveedor JDBC específico. El producto proporciona una plantilla para cada proveedor JDBC soportado. Consulte el tema Valores mínimos necesarios de origen de datos, por proveedor, para ver una lista de todos los proveedores de JDBC soportados. Cuando utilice la consola administrativa para seleccionar una de las plantillas proporcionadas, la consola administrativa le solicita los valores para todas las propiedades necesarias para dicho origen de datos. Consulte el tema Configuración de un proveedor de JDBC y un origen de datos para obtener más información sobre cómo utilizar la consola administrativa para crear un origen de datos. Si decide utilizar la herramienta de scripts wsadmin para crear un origen de datos, consulte el tema Valores mínimos necesarios de origen de datos por proveedor para obtener una lista de los valores necesarios. bprac

Ejemplo

Utilización de la API de JMX para crear los objetos de configuración necesarios para acceder a las bases de datos relacionales. Este ejemplo de código muestra cómo utilizar los MBeans de WebSphere Application Server para crear y configurar los objetos necesarios para acceder a una base de datos relacional de una aplicación empresarial. Estos objetos son, entre otros: un proveedor JDBC, ya sea con capacidad de XA o sin ella, un origen de datos, un alias de autenticación y, opcionalmente, una fábrica de conexiones CMP (con persistencia gestionada por contenedor). Los detalles de la configuración de estas opciones pueden encontrarse en los comentarios de cabecera del código fuente siguiente. El ejemplo también muestra cómo utilizar el MBean de origen de datos para volver a cargar los cambios de la configuración en el servidor en ejecución.

[AIX Solaris HP-UX Linux Windows][IBM i][z/OS]
/**
 * LICENCIA DE COPYRIGHT : Esta información contiene código de ejemplo proporcionado en
 * forma de código fuente. Puede copiar, modificar y distribuir este programa
 * de ejemplo de cualquier forma y sin pago a IBM con el fin de
 * desarrollar, utilizar, comercializar o distribuir programas de aplicación
 * que se ajusten a la interfaz de programación de aplicaciones para la plataforma
 * operativa para la que está escrito el código de ejemplo. Si no se indica
 * lo contrario, IBM PROPORCIONA EL CÓDIGO FUENTE DE EJEMPLO "TAL CUAL"
 * E IBM DECLINA TODAS LAS GARANTÍAS, EXPLÍCITAS O IMPLÍCITAS, INCLUYENDO, PERO
 * SIN LIMITARSE A, LAS GARANTÍAS IMPLÍCITAS O CONDICIONES DE COMERCIALIZACIÓN,
 * CALIDAD SATISFACTORIA, IDONEIDAD PARA UN OBJETIVO DETERMINADO, TÍTULO Y CUALQUIER
 * GARANTÍA O CONDICIÓN DE NO INCUMPLIMIENTO. IBM NO SE HARÁ RESPONSABLE DE
 * LOS DAÑOS DIRECTOS, INDIRECTOS, INCIDENTALES, ESPECIALES O CONSECUENCIALES QUE SURJAN
 * DURANTE LA UTILIZACIÓN U OPERACIÓN DE ESTE CÓDIGO FUENTE DE EJEMPLO. IBM NO TIENE
 * NINGUNA OBLIGACIÓN DE PROPORCIONAR MANTENIMIENTO, SOPORTE, ACTUALIZACIONES, MEJORAS O
 * MODIFICACIONES PARA EL CÓDIGO FUENTE DE EJEMPLO.
 * 
 * © Copyright IBM Corp. 2011.
 * Todos los derechos reservados. Materiales bajo licencia - Propiedad de IBM.
 */

import java.util.Properties;
import java.util.Set;

import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;

import com.ibm.websphere.management.AdminClient;
import com.ibm.websphere.management.AdminClientFactory;
import com.ibm.websphere.management.Session;
import com.ibm.websphere.management.configservice.ConfigServiceHelper;
import com.ibm.websphere.management.configservice.SystemAttributes;
import com.ibm.websphere.management.exception.ConnectorException;

/**
 * Este código de ejemplo muestra el uso de las API de JMX de WebSphere para crear
 * un proveedor y origen de datos jdbc DB2 con un alias de autenticación.
 * Este código de ejemplo puede ser configurado para:
 * - Crear objetos con ámbito de nodo o servidor
 * - Crear un proveedor jdbc XA o no XA
 * - Crear una fábrica de conexiones de forma que el origen de datos
 *   pueda ser utilizado por beans CMP,
 * de lo contrario el origen de datos puede ser utilizado por beans BMP, beans de sesión o
 * servlets
 * Estos se configuran estableciendo el valor de las constantes de clase
 * (consulte "Valores del programa de configuración" más adelante)
 * El proveedor jdbc, origen de datos y fábrica de conexiones CMP (si está configurado)
 * se crean utilizando plantillas predefinidas, que es una práctica mejor.
 * Nota: existen plantillas que creará tanto el proveedor de jdbc como un
 * origen de datos simultáneamente, este ejemplo crea intencionadamente ambos objetos
 * individualmente para ser más riguroso
 * 
 * Para compilar y ejecutar este programa, coloque el paquete de cliente de administración
 * raíz_instalación_was\runtimes\com.ibm.ws.admin.client_9.0.jar
 * en la vía de acceso de clases además del archivo de clases que se ha obtenido cuando
 * se creó este archivo de origen.
 * 
 * Una vez compilado, este programa se ejecuta en su propia JVM y
 * utiliza la API del cliente de administración de WebSphere para interactuar con un
 * WebSphere Application Server de forma local o remota para crear los
 * recursos de JDBC que se han descrito anteriormente.
 */

public class JDBCResourcesWithJMX {

    // valores de configuración del programa
    // si es true, se crea un proveedor jdbc con capacidad XA; si no, no XA
    private static final boolean createXAJDBCProvider = true;
    // si es true, se creará una fábrica de conexiones CMP para que la utilicen los CMP,
    // de lo contrario, el origen de datos creado se puede utilizar con beans BMP, beans
    // de sesión o servlets
    private static final boolean createCMPConnectionFactory = true;
    // si es true, crear objetos con ámbito de nodo; de lo contrario crear servidor
    private static final boolean createNodeScopedCfgObjs = true;
    // finalizar valores de configuración de programa
    
    private static final String jdbcProviderName =
        "Proveedor JDBC de DB2 de ejemplo";
    private static final String jdbcProviderTemplateNameXA =
        "Sólo proveedor de controlador DB2 que utiliza IBM JCC (XA)";
    private static final String jdbcProviderTemplateName =
        "Sólo proveedor de controlador DB2 que utiliza IBM JCC";
    // un alias de datos de autenticación
    private static final String authDataAlias = "db2admin";
    private static final String authAliasDescription =
        "Alias de autenticación de ejemplo";
    private static final String authAliasUserID = "db2admin"; // user ID
    private static final String authAliasPassword = "db2admin"; // password
    private static final String dataSourceProviderTemplateNameXA =
        "Controlador DB2 que utiliza IBM JCC - Origen de datos XA";
    private static final String dataSourceHelperClassName =
        "com.ibm.websphere.rsadapter.DB2DataStoreHelper";
    private static final String cmpConnFactTemplateName =
        "CMPConnectorFactory";
    // mostrar el nombre de origen de datos (DS)y fábrica de conexiones (CF)
    private static final String dataSourceName = "SampleDataSource";
    private static final String dataSourceTemplateName =
        "Controlador DB2 que utiliza IBM JCC - Origen de datos";

    @SuppressWarnings("no utilizado")
    private static final String dbName = "SamplesDB"; // el nombre de base de datos

    public static void main(String[] args) {
        JDBCResourcesWithJMX cds = new JDBCResourcesWithJMX();

        try {
            cds.run(args);
        }
        catch(Exception ex) {
            System.out.println("Se ha detectado una excepción: " + ex);
            ex.printStackTrace();
        }
    }

    /**
     * Crea un proveedor de jdbc, origen de datos, alias de autenticación y fábrica
     * de conexiones, si así está configurado. Ni el origen de datos ni la fábrica de conexiones,
     * si se ha creado, se enlaza al espacio de nombres hasta que el servidor se reinicia o una
     * aplicación que lo utiliza se inicia
     */
    private void run(String[] args) throws Exception {

        // Inicializar el AdminClient.
        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);

        Session session = new Session();

        // utilizar ámbito de nodo para crear objetos de configuración
        ObjectName scope = null;
        if (createNodeScopedCfgObjs) {
            scope = ConfigServiceHelper.createObjectName(null, "Nodo", null);
        }
        else { // a menos que el ámbito de servidor esté configurado
            scope = ConfigServiceHelper.createObjectName(null, "Servidor",
                "server1");
        }
        
        // recuperar el MBean ConfigService
        ObjectName configServiceMBean =
            retrieveJMXMBean(adminClient, "ConfigService");

        // invocar operación queryConfigObjects de mbean
        // para buscar un servidor o un nodo
        ObjectName[] matches = (ObjectName[])adminClient.invoke(
            configServiceMBean,
            "queryConfigObjects",
            // parámetros para operación
            new Object[] {session, null, scope, null},
            // firma de método bean a invocar
            new String[] {"com.ibm.websphere.management.Session",
                "javax.management.ObjectName",
                "javax.management.ObjectName",
                "javax.management.QueryExp"});
        scope = matches[0]; // utilizar el primer objeto de servidor o nodo encontrado

        // crear un proveedor jdbc en el ámbito especificado
        ObjectName jdbcProv =
            createJDBCProvider(adminClient, session, scope, 
            configServiceMBean);

        // crear un alias de autenticación para el origen de datos
        createAuthAlias(adminClient, session, configServiceMBean);

        // Recuperar WebSphere Relational Resource Adapter (RRA) incorporado
        // en el mismo ámbito que arriba
        ObjectName rra =
            ConfigServiceHelper.createObjectName(null, "J2CResourceAdapter",
                null);

        // invocar operación queryConfigObjects de mbean
        matches = (ObjectName[])adminClient.invoke(
            configServiceMBean,
            "queryConfigObjects",
            // parámetros para operación
            new Object[] {session, scope, rra, null},
            // firma de método bean a invocar
            new String[] {"com.ibm.websphere.management.Session",
                "javax.management.ObjectName",
                "javax.management.ObjectName",
                "javax.management.QueryExp"});
        rra = matches[0]; // utilizar el primer objeto encontrado en este ámbito

        // crear un origen de datos utilizando el proveedor jdbc
        ObjectName dataSource =
            createDataSource(adminClient, session, scope, jdbcProv, rra,
                configServiceMBean);

        // si se ha configurado para ello, crear una fábrica de conexiones en el
        // WebSphere RRA incorporado para su uso por parte de los CMP
        if (createCMPConnectionFactory) {
            createConnectionFactory(adminClient, session, rra, dataSource,
                configServiceMBean);
        }

        // invocar operación guardar mbean para que persistan los cambios
        // en el repositorio de configuración, si la plataforma es ND
        // también necesitará realizar una sincronización de nodo
        adminClient.invoke(
            configServiceMBean,
            "save",
            // parámetros para operación
            new Object[] {session, false},
            // firma de método bean a invocar
            new String[] {"com.ibm.websphere.management.Session",
                "boolean"});
        
        System.out.println("Cambios de configuración guardados");

        // recargar MBean de origen de datos
        reload(adminClient, session);
    }

    /**
     * Utilizar el MBean ConfigService para crear un alias de autenticación
     */
    private void createAuthAlias(AdminClient adminClient, Session session,
        ObjectName configServiceMBean) throws Exception {

        // Buscar el objeto de seguridad padre
        ObjectName security =
            ConfigServiceHelper.createObjectName(null, "Security", null);
        // invocar operación queryConfigObjects de mbean
        Object result = adminClient.invoke(
            configServiceMBean,
            "queryConfigObjects",
            // parámetros para operación
            new Object[] {session, null, security, null},
            // firma de método bean a invocar
            new String[] {"com.ibm.websphere.management.Session",
                "javax.management.ObjectName",
                "javax.management.ObjectName",
                "javax.management.QueryExp"});
        security = ((ObjectName[])result)[0];
        
        // Preparar la lista de atributos
        AttributeList authAliasAttrs = new AttributeList();
        authAliasAttrs.add(new Attribute("alias", authDataAlias));
        authAliasAttrs.add(new Attribute("userId", authAliasUserID));
        authAliasAttrs.add(new Attribute("password", authAliasPassword));
        authAliasAttrs.add(
            new Attribute("description", authAliasDescription));

        // invocar operación jmx createConfigData
        result = adminClient.invoke(configServiceMBean, "createConfigData",
            // parámetros para operación
            new Object[] {session, security, "authDataEntries",
            "JAASAuthData", authAliasAttrs},
            // firma de método bean a invocar
            new String[] {"com.ibm.websphere.management.Session",
                "javax.management.ObjectName",
                "java.lang.String",
                "java.lang.String",
                "javax.management.AttributeList"});
        
        System.out.println("Se ha creado el alias de autorización: " + authDataAlias);
    }

    /*
     * Utilizar el MBean ConfigService para crear una fábrica de conexiones CMP
     * en el WebSphere RRA incorporado
     */
    private void createConnectionFactory(AdminClient adminClient,
        Session session, ObjectName rra, ObjectName dataSource,
        ObjectName configServiceMBean)
        throws Exception {
        
        // Preparar la lista de atributos
        AttributeList cfAttrs = new AttributeList();
        cfAttrs.add(new Attribute("name", dataSourceName + "_CF"));
        cfAttrs.add(new Attribute("authMechanismPreference",
            "BASIC_PASSWORD"));
        cfAttrs.add(new Attribute("authDataAlias",authDataAlias));
        cfAttrs.add(new Attribute("cmpDatasource", dataSource ));
        
        // invocar operación jmx queryTemplates
        Object result = adminClient.invoke(
            configServiceMBean,
            "queryTemplates",
            // parámetros para operación
            new Object[] {session, "CMPConnectorFactory",},
            // firma de método bean a invocar
            new String[] {"com.ibm.websphere.management.Session",
                "java.lang.String"});

        // buscar la plantilla con el atributo de nombre de visualización que desea
        ObjectName connFactTemplate = null;
        if (result != null) {
            ObjectName[] templates = (ObjectName[])result;
            for (ObjectName template: templates) {
                if (cmpConnFactTemplateName.equals(template.getKeyProperty(
                    SystemAttributes._WEBSPHERE_CONFIG_DATA_DISPLAY_NAME))) {
                    connFactTemplate = template;
               }
            }
        }

        // utilizar la plantilla encontrada arriba para crea la fábrica de conexiones CMP
        // invocar operación jmx createConfigDataByTemplate
        adminClient.invoke(
            configServiceMBean,
            "createConfigDataByTemplate",
            // parámetros para operación
            new Object[] {session, rra, "CMPConnectorFactory",
                cfAttrs, connFactTemplate},
            // firma de método bean a invocar
            new String[] {"com.ibm.websphere.management.Session",
                "javax.management.ObjectName",
                "java.lang.String",
                "javax.management.AttributeList",
                "javax.management.ObjectName"
                });

        System.out.println("Se ha creado la fábrica de conexiones CMP: " +
            dataSourceName + "_CF");
    }

    /**
     * Utilizar el MBean ConfigService para crear un origen de datos en
     * el ámbito especificado de una de las plantillas predefinidas
     */
    private ObjectName createDataSource(AdminClient adminClient,
        Session session, ObjectName scope, ObjectName jdbcProv,
        ObjectName rra, ObjectName configServiceMBean)
        throws Exception {

        // el nombre de plantilla a utilizar en función de si este ejemplo
        // está configurado para utilizar un origen de datos XA o no
        String templateName = dataSourceProviderTemplateNameXA;
        if (!createXAJDBCProvider) {
            templateName = dataSourceTemplateName;
        }
        
        // el atributo DataSource.relationResourceAdapter es necesario
        // además de los atributos de la plantilla
        AttributeList dsAttrs = new AttributeList();
        dsAttrs.add(new Attribute("name", dataSourceName));
        // sustituir algunas otras propiedades de la plantilla
        dsAttrs.add(new Attribute("description", dataSourceName));
        dsAttrs.add(new Attribute("jndiName", "jdbc/" + dataSourceName));
        dsAttrs.add(new Attribute("datasourceHelperClassname",
            dataSourceHelperClassName));
        // enlazar con el WebSphere RRA incorporado
        dsAttrs.add(new Attribute("relationalResourceAdapter", rra));
        dsAttrs.add(new Attribute("authDataAlias",authDataAlias));

        // invocar operación jmx queryTemplates
        Object result = adminClient.invoke(
            configServiceMBean,
            "queryTemplates",
            // parámetros para operación
            new Object[] {session, "DataSource"},
            // firma de método bean a invocar
            new String[] {"com.ibm.websphere.management.Session",
                "java.lang.String"});

        // buscar la plantilla con el atributo de nombre de visualización que desea
        ObjectName db2Template = null;
        if (result != null) {
            ObjectName[] templates = (ObjectName[])result;
            for (ObjectName template: templates) {
                if (templateName.equals(template.getKeyProperty(
                    SystemAttributes._WEBSPHERE_CONFIG_DATA_DISPLAY_NAME))) {
                    db2Template = template;
               }
            }
        }

        // utilizar la plantilla encontrada arriba para crear el origen de datos
        // invocar operación jmx createConfigDataByTemplate
        ObjectName dataSource = (ObjectName)adminClient.invoke(
            configServiceMBean,
            "createConfigDataByTemplate",
            // parámetros para operación
            new Object[] {session, jdbcProv, "DataSource",
                dsAttrs, db2Template},
            // firma de método bean a invocar
            new String[] {"com.ibm.websphere.management.Session",
                "javax.management.ObjectName",
                "java.lang.String",
                "javax.management.AttributeList",
                "javax.management.ObjectName"
                });

        System.out.println("Se ha creado el origen de datos: " + dataSourceName +
            " en " + (createNodeScopedCfgObjs ? "nodo" : "servidor") +
            " ámbito");
        return dataSource;
    }

    /**
     * Obtener el MBean DataSourceCfgHelper y llamar a reload() en él
     * Esto hace que los objetos de configuración que se acaban de crear
     * estén disponibles.
     */
    private void reload(AdminClient adminClient, Session session)
        throws Exception {

        // recuperar el MBean DataSourceCfgHelper
        ObjectName mBean =
            retrieveJMXMBean(adminClient, "DataSourceCfgHelper");

        // llamar a la operación de recarga
        Object result =
            adminClient.invoke(
                mBean,
                "recargar",
                new Object[] {},
                new String[] {});

        if (result != null) {
            System.err.println(
                "La operación de recargar MBean DataSourceCfgHelper ha fallado: "
                + result);
        }
        else {
            System.out.println("Se ha recargado el MBean DataSourceCfgHelper");
        }
    }
    
    /**
     * Utilice el MBean ConfigService para crear un proveedor jdbc en el
     * ámbito de una de las plantillas predefinidas
     */
    private ObjectName createJDBCProvider(
        AdminClient adminClient, Session session, ObjectName scope,
        ObjectName configServiceMBean) throws Exception {

        // el nombre de plantilla a utilizar en función de si este ejemplo
        // está configurado para utilizar un proveedor jdbc XA o no
        String templateName = jdbcProviderTemplateNameXA;
        if (!createXAJDBCProvider) {
            templateName = jdbcProviderTemplateName;
        }
                    
        // invocar operación jmx queryTemplates
        Object result = adminClient.invoke(
            configServiceMBean,
            "queryTemplates",
            // parámetros para operación
            new Object[] {session, "JDBCProvider"},
            // firma de método bean a invocar
            new String[] {"com.ibm.websphere.management.Session",
                "java.lang.String"});

        // buscar la plantilla con el atributo de nombre de visualización que desea
        ObjectName db2Template = null;
        if (result != null) {
            ObjectName[] templates = (ObjectName[])result;
            for (ObjectName template: templates) {
                if (templateName.equals(template.getKeyProperty(
                    SystemAttributes._WEBSPHERE_CONFIG_DATA_DISPLAY_NAME))) {
                    db2Template = template;
                }
            }
        }

        // el atributo JDBCProvider.name es necesario además de
        // los atributos de la plantilla
        AttributeList provAttrs = new AttributeList();
        provAttrs.add(new Attribute("nombre", jdbcProviderName
            + (createXAJDBCProvider ? " (XA)" : "")));
        // sustituir la descripción de la plantilla
        provAttrs.add(new Attribute("descripción", jdbcProviderName
            + (createXAJDBCProvider ? " (XA)" : "")));
        
        // utilizar la plantilla encontrada arriba para crear el proveedor jdbc
        // invocar operación jmx createConfigDataByTemplate
        ObjectName jdbcProvider = (ObjectName)adminClient.invoke(
            configServiceMBean,
            "createConfigDataByTemplate",
            // parámetros para operación
            new Object[] {session, scope, "JDBCProvider",
                provAttrs, db2Template},
            // firma de método bean a invocar
            new String[] {"com.ibm.websphere.management.Session",
                "javax.management.ObjectName",
                "java.lang.String",
                "javax.management.AttributeList",
                "javax.management.ObjectName"
                });
        
        System.out.println("Se ha creado el proveedor JDBC: " + jdbcProviderName
            + (createXAJDBCProvider ? " (XA)" : "")  +
            " en " + (createNodeScopedCfgObjs ? "nodo" : "servidor") +
            " ámbito");
        return jdbcProvider;
    }

    // buscar el MBean especificado
    @SuppressWarnings("unchecked")
    private ObjectName retrieveJMXMBean(AdminClient adminClient,
        String beanName)
        throws MalformedObjectNameException, ConnectorException {
        // recuperar el MBean ConfigService
        ObjectName mBean = null;
        ObjectName queryName =
            new ObjectName("WebSphere:type=" + beanName + ",*");
        Set names = adminClient.queryNames(queryName, null);
        if (!names.isEmpty()) {
            mBean = (ObjectName) names.iterator().next();
        }
        return mBean;
    }
}

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tdat_cjmxapis
File name: tdat_cjmxapis.html