Servicio de conexión de prueba
WebSphere Application Server proporciona un servicio de conexión de prueba para validar las configuraciones de origen de datos. La operación testConnection genera una instancia de la configuración de origen de datos, obtiene una conexión y, a continuación, cierra la conexión de inmediato.
Si la definición de origen de datos incluye una variable de WebSphere, necesita determinar pueden afectar los valores de ámbito de la variable y del origen de datos a los resultados de conexión de prueba. El siguiente paso es elegir cuál de las tres maneras desea escoger para activar el servicio de conexión de prueba: mediante la consola administrativa, la herramienta wsadmin o un programa Java™ autónomo.
Comprobación de los valores de ámbito
La asociación de variables de WebSphere con las configuraciones de origen de datos puede generar resultados de la conexión de prueba que no sean congruentes con el comportamiento del tiempo de ejecución de la aplicación. En algunos casos, una operación de conexión de prueba falla, pero el origen de datos físico funciona correctamente en el tiempo de ejecución de la aplicación. La causa del posible conflicto es la diferencia entre cómo maneja el servidor de aplicaciones los valores de ámbito de las variables de WebSphere en el tiempo de ejecución y cómo maneja esos mismos valores de ámbito para una operación de conexión de prueba. La comprensión de la diferencia ayuda a crear configuraciones de origen de datos satisfactorias.
- El ámbito de la variable puede contener la configuración del origen de datos, esto es, la variable tiene el ámbito mayor.
- La variable y el origen de datos tienen ámbitos idénticos.
Ámbito del origen de datos | JVM donde se realizan la operación de conexión de prueba |
---|---|
Cell | Proceso del gestor |
Nodo | Proceso de agente de nodo (del nodo relevante) |
Clúster | Agente de nodo de cada nodo que contiene un miembro de clúster |
Servidor | Servidor; si el servidor no está disponible, la operación de conexión de prueba se vuelve a intentar en el agente de nodo del nodo que contiene el servidor de aplicaciones. |
![[z/OS]](../images/ngzos.gif)
- Controlador de IBM Data Server para JDBC y origen de datos SQLJ con un controlador del tipo 2
- Origen de datos del proveedor de controlador JDBC de DB2 Universal con un controlador de tipo 2
java.sql.SQLException: Error al cargar la biblioteca nativa T2 db2jcct2DSRA0010E:
Estado de SQL = null, Código de error = -99,999
Sin embargo, en algunos casos, el error puede ser parecido al siguiente mensaje: T2zOS exception: [jcc][T2zos]T2zosReusableConnection.flowConnect:initRRSAFAttach
:2528: Connection dead
Estos dos orígenes de datos se basan en los controladores JDBC de tipo 2, que necesitan acceder a la biblioteca nativa T2. El entorno de ejecución para el servidor de aplicaciones proporciona ese acceso para los orígenes de datos en un proceso de servidor, pero el servicio de conexión de prueba no proporciona acceso a estos archivos nativos cuando se ejecuta en el proceso de agente de nodo. Por lo tanto, cuando cree estos orígenes de datos en el ámbito de nodo o en el ámbito de clúster, es posible que desee crear temporalmente las mismas configuraciones en el ámbito de servidor para realizar pruebas. Ejecute la operación de operación a nivel de servidor para determinar si los valores de origen de datos son válidos para la configuración global.
Ámbito del origen de datos | Variables a nivel de célula | Variables a nivel de nodo | Variables a nivel de servidor |
---|---|---|---|
Nivel de célula | Bien | Error | Error |
Nivel de nodo | Bien | Bien | Error |
Nivel de servidor | Bien | Bien | Bien |
De modo contrario a lo previsto, estos errores de conexión de prueba no suelen generar anomalías durante la ejecución. Asegúrese de que todos los clientes que deben utilizar el origen de datos puedan acceder a la ubicación de los archivos de controlador JDBC y configure la variable de WebSphere con la vía de acceso completa de dicha ubicación.
No obstante, una de las combinaciones de ámbito de la Tabla 2 puede generar el caso contrario: la operación de conexión de prueba es satisfactoria, pero el origen de datos falla en el tiempo de ejecución. Esta anomalía se produce cuando hay un origen de datos de ámbito de célula que utiliza una variable WebSphere de ámbito de célula. La prueba de conexión es correcta debido a que la operación se lleva a cabo en el proceso del gestor de despliegue (como se indica en la Tabla 1), donde el servidor de aplicaciones puede resolver la variable de ámbito de célula. El origen de datos puede fallar en tiempo de ejecución dado que la variable de ámbito de célula puede alterarse temporalmente con un valor nulo.
Cuando crea un nodo, el servidor de aplicaciones crea variables de entorno para todos los controladores JDBC soportados en el ámbito de nodo e inicializa cada variable con una serie vacía. Debido a que un servidor de aplicaciones intenta resolver variables desde el extremo inferior del espectro del ámbito hasta el extremo superior, la variable del ámbito de nodo altera temporalmente la variable de ámbito de célula durante la ejecución. El servidor lee la serie vacía y la acepta como la classpath del controlador JDBC. La classpath nula genera una excepción classNotFound cuando el servidor intenta utilizar el origen de datos.
Al utilizar cualquiera de las opciones administrativas del servidor de aplicaciones, puede impedir que la serie vacía se convierta en el valor final de la variable de la classpath del controlador.
- Utilización de la consola administrativa de WebSphere Application Server: el programa del asistente del origen de datos copia el valor de la variable de ámbito de célula (que se especifica en el asistente de creación del proveedor JDBC) en la variable de ámbito de nodo del mismo nombre. El programa del asistente efectúa esta operación de copia sólo si la variable de ámbito de nodo tiene el valor de serie vacía, de este modo, el programa no cambia una classpath válida que haya especificado anteriormente.Para asegurarse de que el origen de datos funciona con la variable de ámbito de nodo durante la ejecución, siga estos pasos:
- Instale los archivos del controlador JDBC en el nodo del gestor de despliegue, al igual que en cada nodo en el que deba funcionar el origen de datos.
- Utilice la vía de acceso del archivo del controlador en el gestor de despliegue para definir la variable de WebSphere para un proveedor JDBC en el ámbito de célula.
- Asegúrese de que el origen de datos esté asociado al proveedor JDBC del gestor de despliegue y tenga el mismo ámbito de célula.Importante: Asegúrese de que la operación se realice correctamente instalando los archivos de controlador en las ubicaciones que tengan nombres idénticos de vía de acceso completa, incluido el nodo del gestor de despliegue. De lo contrario, es probable que vuelva a reproducirse el mismo caso de una conexión de prueba correcta pero con un error de tiempo de ejecución.
- Utilización de la herramienta de scripts wsadmin: para que funcione el origen de datos para la operación de conexión de prueba y durante la ejecución, cree las mismas configuraciones de classpath del controlador en el ámbito de célula y en todos los ámbitos de nodo relevantes. Siga estos pasos:
- Instale los archivos del controlador JDBC en el nodo del gestor de despliegue. Utilice dicho nombre de vía de acceso para definir la variable de classpath del controlador para un proveedor JDBC en el ámbito de célula.
- Asegúrese de que el origen de datos esté asociado al proveedor JDBC del gestor de despliegue y tenga el mismo ámbito de célula.
- En cada nodo en el que debe funcionar el origen de datos, instale los archivos del controlador JDBC y utilice la vía de acceso para definir la variable WebSphere para un proveedor JDBC en el ámbito de nodo. Cada una de estos proveedores deben tener la misma configuración.Importante: Asegúrese de que la operación se realice correctamente instalando los archivos de controlador en las ubicaciones que tengan nombres idénticos de vía de acceso completa, incluido el nodo del gestor de despliegue. De lo contrario, es probable que vuelva a reproducirse el mismo caso de una conexión de prueba correcta pero con un error de tiempo de ejecución.
Utilice los recursos de ámbito de célula sólo si todos los nodos que necesiten acceso al origen de datos, incluido el nodo del gestor de despliegue, se ejecutan en la misma plataforma y tienen instalados los controladores JDBC en la misma ubicación. De lo contrario, utilice el ámbito de nodo como el valor de ámbito mayor para los orígenes de datos.
Omisión de las búsquedas de variables
Puede omitir las búsquedas de variables de entorno cambiando las entradas de classpath del proveedor de JDBC por valores codificados. No obstante, esta estrategia sólo es correcta sólo si configura la classpath de igual modo en todos los nodos donde debe funcionar el origen de datos.
Activación del servicio de conexión de prueba
Hay tres formas de activar el servicio de conexión de prueba: mediante la consola administrativa, la herramienta wsadmin o un programa autónomo Java. Cada proceso invoca los mismos métodos en el mismo MBean.
Consola de administración
WebSphere Application Server permite probar una conexión desde la consola administrativa con sólo pulsar un botón: las páginas Colección de orígenes de datos, Valores de orígenes de datos, Colección de orígenes de datos Versión 4 y Valores de orígenes de datos Versión 4 incluyen todas botones Conexión de prueba. Una vez definido y guardado el origen de datos, puede pulsar este botón para verificar que los parámetros de la definición del origen de datos son los correctos. En la página de la colección, puede seleccionar varios orígenes de datos y probarlos todos a la vez. Tenga en cuanta que se deben cumplir primero determinadas condiciones. Para obtener más información, consulte el tema Prueba de una conexión con la consola administrativa.
La conexión de prueba ha fallado para el origen de datos isagent en el servidor server1 del nodo
svtaix24Node01 con la excepción siguiente: java.lang.Exception:
java.sql.SQLException: JZ006: Se ha detectado la excepción IOException: java.net.ConnectException: Un
host remoto ha rechazado una operación de conexión.DSRA0010E: SQL State = JZ006,
Código de error = 0
Esta excepción se produce cuando el número de puerto del origen de datos Sybase no coincide con el puerto configurado en el servidor Sybase. El número de puerto predeterminado es
5000. Compruebe el número de puerto para el servidor Sybase en el archivo de interfaces
bajo /<directorio_instalación_sybase>.Herramienta WsAdmin
La herramienta wsadmin proporciona una interfaz de scripts para una amplia gama de actividades de administración de WebSphere Application Server. Como la función de Conexión de prueba se implementa como método en un MBean, y wsadmin puede invocar métodos de MBean, wsadmin se puede utilizar para comprobar conexiones con los orígenes de datos. Tiene dos opciones para probar una conexión de origen de datos mediante wsadmin:
El objeto AdminControl de wsadmin tiene una operación testConnection que comprueba las propiedades de configuración de un objeto de origen de datos. Para obtener información, consulte el tema Prueba de una conexión utilizando wsadmin.
También puede comprobar una conexión invocando la operación de MBean. Utilice el ejemplo del tema Ejemplo: Prueba de conexión de orígenes de datos utilizando wsadmin como guía para esta técnica.
Programa autónomo Java
Finalmente, puede probar una conexión ejecutando el método testConnection en el MBean DataSourceCfgHelper. Este método permite pasar el ID de configuración del origen de datos configurado. El programa Java se conecta con un servidor JMX (Java Management Extensions) en ejecución para acceder al MBean. En una instalación de WebSphere Application Server, Network Deployment de Application Server, se conecta al servidor JMX que se está ejecutando en el gestor de despliegue, normalmente en el puerto 8879.
El valor de retorno de esta invocación es 0, un número positivo o una excepción. 0 indica que la operación se ha realizado satisfactoriamente, sin ningún aviso. Un número positivo indica que la operación se ha realizado satisfactoriamente, con el número de avisos. Una excepción indica que no se ha podido realizar la comprobación de la conexión.
El siguiente código de ejemplo crea una instancia de origen de datos y una instancia de conexión asociada, y las prueba para garantizar la conectividad de la base de datos.
Este programa utiliza JMX para conectarse a un servidor en ejecución e invocar el método testConnection en el MBean DataSourceCfgHelper. El acrónimo ND de una línea de comentarios indica que el código siguiente se aplica a WebSphere Application Server WebSphere Application Server, Network Deployment. La palabra Base de una línea de comentarios indica que el código siguiente se aplica a WebSphere Application Server.
/**
* Descripción
* Programa de prueba de adaptador de recursos para garantizar que las interfaces del MBean
funcionan.
* Se prueban las siguientes interfaces
*
* --- testConnection()
*
*
* Necesitamos lo siguiente para ejecutar
* C:\src>java -Djava.ext.dirs=C:\WebSphere\AppServer\lib;C:\WebSphere\AppServer\java\jre\lib\ext testDSGUI
*debe incluir jre para log.jar y mail.jar, o se obtiene una excepción de clase no encontrada
*
*
*/
import java.util.Iterator;
import java.util.Locale;
import java.util.Properties;
import java.util.Set;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.RuntimeMBeanException;
import javax.management.RuntimeOperationsException;
import com.ibm.websphere.management.AdminClient;
import com.ibm.websphere.management.AdminClientFactory;
import com.ibm.ws.rsadapter.exceptions.DataStoreAdapterException;
public class testDSGUI {
//Utilice el puerto 8880 para la instalación Base o el puerto 8879 para la instalación ND
String port = "8880";
// String port = "8879";
String host = "localhost";
final static boolean verbose = true;
// por ejemplo, un ID de configuración de DataSource declarado a nivel de nodo para la instalación Base
private static final String resURI = "cells/cat/nodes/cat|resources.xml#DataSource_1";
// por ejemplo, un DataSource 4.0 declarado a nivel de nodo para la instalación Base
// private static final String resURI = "cells/cat/nodes/cat|resources.xml#WAS40DataSource_1";
// por ejemplo, un DataSource de Apache Derby declarado a nivel de servidor para la instalación Base
//private static final String resURI = "cells/cat/nodes/cat/servers/server1/resources.xml#DataSource_6";
// por ejemplo, un DataSource a nivel de nodo para la instalación ND
//private static final String resURI = "cells/catNetwork/nodes/cat|resources.xml#DataSource_1";
// por ejemplo, un DataSource a nivel de servidor para la instalación ND
//private static final String resURI = "cells/catNetwork/nodes/cat/servers/server1|resources.xml#DataSource_4";
// por ejemplo, un DataSource a nivel de célula para la instalación ND
//private static final String resURI = "cells/catNetwork|resources.xml#DataSource_1";
public static void main(String[] args) {
testDSGUI cds = new testDSGUI();
cds.run(args);
}
/**
* Este método prueba el ResourceMbean.
*
* @param args
* @exception Exception
*/
public void run(String[] args) {
try {
System.out.println("Connecting to the application server.......");
/*************************************************************************/
/** Inicializar AdminClient */
/*************************************************************************/
Properties adminProps = new Properties();
adminProps.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP);
adminProps.setProperty(AdminClient.CONNECTOR_HOST, host);
adminProps.setProperty(AdminClient.CONNECTOR_PORT, port);
AdminClient adminClient = null;
try {
adminClient = AdminClientFactory.createAdminClient(adminProps);
} catch (com.ibm.websphere.management.exception.ConnectorException ce) {
System.out.println("NLS: Cannot make a connection to the application server\n");
ce.printStackTrace();
System.exit(1);
}
/*************************************************************************/
/** Localizar el Mbean */
/*************************************************************************/
ObjectName handle = null;
try {
// Enviar una serie de localizador
// por ejemplo, para una Base, esto es suficiente
ObjectName queryName = new ObjectName("WebSphere:type=DataSourceCfgHelper,*");
// para la instalación ND, deberá especificar desde qué nodo/proceso desea realizar la prueba
// por ejemplo, ejecutar en el servidor
//ND: ObjectName queryName = new OjectName
("WebSphere:cell=catNetwork,node=cat,process=server1,type=DataSourceCfgHelper,*");
// por ejemplo, ejecutar en el agente de nodo
//ND: ObjectName queryName = new ObjectName
("WebSphere:cell=catNetwork,node=cat,process=nodeagent,type=DataSourceCfgHelper,*");
//ND: por ejemplo, ejecutar en el Gestor
//ND: ObjectName queryName = new ObjectName
("WebSphere:cell=catNetwork,node=catManager,process=dmgr,type=DataSourceCfgHelper,*");
Set s = adminClient.queryNames(queryName, null);
Iterator iter = s.iterator();
while (iter.hasNext()) {
// utilizar el primer MBean que se encuentra
handle = (ObjectName) iter.next();
System.out.println("Found this ->" + handle);
}
if (handle == null) {
System.out.println("NLS: Did not find this MBean>>" + queryName);
System.exit(1);
}
} 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);
}
/*************************************************************************/
/** Crear parámetros para pasarlos a Mbean */
/*************************************************************************/
String[] signature = { "java.lang.String" };
Object[] params = { resURI };
Object result = null;
if (verbose) {
System.out.println("\nTesting connection to the database using " + handle);
}
try {
/*************************************************************************/
/** Empezar a probar la conexión con la base de datos */
/*************************************************************************/
result = adminClient.invoke(handle, "testConnection", params, signature);
} catch (MBeanException mbe) {
// ****** todas las excepciones de usuario vienen aquí
if (verbose) {
Exception ex = mbe.getTargetException(); // ésta es la excepción real del Mbean
System.out.println("\nNLS:Mbean Exception was received contains " + ex);
ex.printStackTrace();
System.exit(1);
}
} catch (InstanceNotFoundException infe) {
System.out.println("Cannot find " + infe);
} catch (RuntimeMBeanException rme) {
Exception ex = rme.getTargetException();
ex.printStackTrace(System.out);
throw ex;
} catch (Exception ex) {
System.out.println("\nUnexpected Exception occurred: " + ex);
ex.printStackTrace();
}
/*************************************************************************/
/** Procesar el resultado. El resultado será el número de avisos */
/** emitidos. El resultado 0 indica una conexión satisfactoria sin */
/** avisos. */
/*************************************************************************/
//El resultado 0 indica una conexión satisfactoria sin avisos.
System.out.println("Result= " + result);
} catch (RuntimeOperationsException roe) {
Exception ex = roe.getTargetException();
ex.printStackTrace(System.out);
} catch (Exception ex) {
System.out.println("General exception occurred");
ex.printStackTrace(System.out);
}
}
}