연결 테스트 서비스
WebSphere® Application Server는 데이터 소스 구성의 유효성을 검증하기 위해 연결 테스트 서비스를 제공합니다. testConnection 조작은 데이터 소스 구성을 인스턴스화하여 연결을 확보한 후 즉시 연결을 닫습니다.
데이터 소스의 정의가 WebSphere 변수를 포함하는 경우, 변수 및 데이터 소스 모두의 범위 설정이 연결 테스트 결과에 영향을 미칠 수 있는 방법을 결정해야 합니다. 다음 단계는 세 가지(관리 콘솔, wsadmin 도구 또는 Java™ 독립형 프로그램) 중 하나를 통해 연결 테스트 서비스를 활성화하려는 방법을 선택하는 것입니다.
범위 설정 확인
WebSphere 변수와 데이터 소스 구성을 연관시키면 애플리케이션의 런타임 동작과 일치하지 않는 연결 테스트 결과가 나올 수 있습니다. 연결 테스트 조작이 실패하는 경우도 있지만 데이터 소스는 애플리케이션 런타임 중에 정상적으로 기능합니다. 잠재적 충돌의 원인은 애플리케이션 서버가 런타임 시 WebSphere 변수의 범위 설정을 처리하는 방법과 연결 테스트 조작에 대해 동일한 범위 설정을 처리하는 방법이 다르기 때문입니다. 차이점을 이해하면 데이터 소스 구성을 성공적으로 작성하는 데 도움이 됩니다.
- 변수 범위가 데이터 소스 구성을 포함할 수 있습니다. 즉, 변수의 범위를 더 큰 범위를 가집니다.
- 변수와 데이터 소스의 범위가 같습니다.
데이터 소스 범위 | 연결 테스트 조작이 발생하는 JVM |
---|---|
셀 | 관리자 프로세스 |
노드 | 노드 에이전트 프로세스(관련 노드의) |
클러스터 | 클러스터 멤버를 포함하는 각 노드의 노드 에이전트 |
서버 | 서버; 서버가 사용 불가능하면, 연결 테스트 조작이 애플리케이션 서버가 있는 노드의 노드 에이전트에서 재시도됩니다. |
![[z/OS]](../images/ngzos.gif)
- IBM Data Server Driver for JDBC 및 SQLJ 데이터 소스(드라이버 유형 2 사용)
- DB2 Universal JDBC 드라이버 데이터 소스(드라이버 유형 2 사용)
java.sql.SQLException: Failure in loading T2 native library db2jcct2DSRA0010E: SQL state = null, Error Code = -99,999
어떤
경우에는, 오류가 다음 메시지와 유사합니다.T2zOS exception: [jcc][T2zos]T2zosReusableConnection.flowConnect:initRRSAFAttach
:2528: Connection dead
두 가지 데이터 소스 모두 유형 2 JDBC 드라이버에 기반하며,
T2 기본 라이브러리에 대한 액세스를 필요로 합니다.
애플리케이션 서버의 런타임 환경은 서버 프로세스의 데이터
소스에 대한 액세스를 제공하지만, 연결 테스트 서비스는
노드 에이전트 프로세스에서 실행되는 경우 해당 기본 파일에
대한 액세스를 제공하지 않습니다.따라서, 노드 범위 또는 클러스터 범위에서 이 데이터 소스를 작성할 때에는 테스트용으로 서버 범위에 동일한 구성을 임시로 작성하려 할 수도 있습니다. 서버 레벨에서 연결 테스트 조작을 실행하여 데이터 소스 설정이 전체 구성에 유효한지 판별하십시오.
데이터 소스 범위 | 셀 레벨 변수 | 노드 레벨 변수 | 서버 레벨 변수 |
---|---|---|---|
셀 레벨 | 확인 | 실패 | 실패 |
노드 레벨 | 확인 | 확인 | 실패 |
서버 레벨 | 확인 | 확인 | 확인 |
예상과는 달리, 이러한 연결 테스트가 일반적으로 런타임 시 실패로 변환되지 않습니다. 데이터 소스를 사용해야 하는 모든 클라이언트에서 JDBC 드라이버 파일의 위치에 액세스할 수 있고 해당 위치의 전체 경로를 사용하여 WebSphere 변수를 구성했는지 확인하십시오.
그러나 표 2에 나열된 범위 조합 중 하나는 반대 시나리오를 생성할 수 있습니다. 연결 테스트 조작이 성공적으로 수행되지만 런타임 시 데이터 소스가 실패합니다. 이 오류는 셀 범위 WebSphere 변수를 사용하는 셀 범위 데이터 소스의 경우에 발생합니다. Application Server가 셀 범위 변수를 해석할 수 있는 배치 관리자 프로세스에서 연결 테스트 조작이 발생하므로 연결 테스트가 성공합니다(표 1에서 설명). 셀 범위 변수가 널값으로 대체될 수 있으므로 해당 데이터 소스는 런타임에 실패할 수 있습니다.
노드를 작성할 때, Application Server는 노드 범위에 모든 지원되는 JDBC 드라이버의 환경 변수를 작성하고 빈 문자열을 사용하여 각 변수를 초기화합니다. 애플리케이션 서버가 범위 스펙트럼의 하단에서 상단으로 변수를 해석하려고 하므로, 노드 범위 변수가 런타임에 셀 범위 변수를 대체합니다. 서버는 빈 문자열을 읽고 이를 JDBC 드라이버 클래스 경로로 허용합니다. 서버가 데이터 소스를 사용하려고 할 때 널 클래스 경로가 올바르지 않으면 classNotFound 예외가 발생합니다.
Application Server 관리 옵션 중 하나를 사용하여 빈 문자열이 드라이버 클래스 경로 변수의 마지막 값이 되지 않도록 방지할 수 있습니다.
- WebSphere Application Server 관리 콘솔 사용: 데이터 소스 마법사 프로그램은
셀 범위 변수 값(사용자가 JDBC 제공자 작성 마법사에서 지정)을 동일한 이름의 노드 범위 변수에 복사합니다. 마법사 프로그램은 노드 범위 변수에 빈 문자열
값이 있는 경우에만 이 복사 조작을 수행합니다. 따라서 프로그램은 이전에 지정한 유효한 클래스
경로를 변경하지는 않습니다.데이터 소스가 런타임에 노드 범위 변수와 작동하는지 확인하려면 다음 단계를 따르십시오.
- 데이터 소스가 기능해야 하는 모든 노드뿐만 아니라 배치 관리자 노드에도 JDBC 드라이버 파일을 설치하십시오.
- 배치 관리자의 드라이버 파일 경로를 사용하여 셀 범위에 JDBC 제공자의 WebSphere 변수를 정의하십시오.
- 데이터 소스가 배치 관리자 JDBC 프로바이더와 연관되어 있고
동일한 셀 범위를 갖는지 확인하십시오.중요사항: 배치 관리자 노드를 포함한 모든 노드에서 동일한 전체 경로 이름을 사용하는 위치에 드라이버 파일을 설치하여 성공적으로 실행되도록 하십시오. 그렇지 않으면, 동일한 연결 테스트 시나리오가 성공해도 런타임 장애가 재발생할 수 있습니다.
- wsadmin 스크립트 도구 사용: 연결 테스트 조작 및 런타임 둘다에 대해 데이터 소스가 작동하도록 하려면
셀 범위 및 모든 관련 노드 범위에서 동일한 드라이버 클래스 경로 구성을 작성하십시오. 다음 단계를 수행하십시오.
- 배치 관리자 노드에서 JDBC 드라이버 파일을 설치하십시오. 해당 경로 이름을 사용하여 셀 범위에서 JDBC 프로바이더의 드라이버 클래스 경로 변수를 정의하십시오.
- 데이터 소스가 배치 관리자 JDBC 프로바이더와 연관되어 있고 동일한 셀 범위를 갖는지 확인하십시오.
- 데이터 소스가 기능해야 하는 각 노드에서 JDBC 드라이버 파일을 설치하고 경로를 사용하여 노드 범위에 JDBC 제공자의
WebSphere 변수를 정의하십시오. 이러한 각 프로바이더는 구성이 동일해야 합니다.중요사항: 배치 관리자 노드를 포함한 모든 노드에서 동일한 전체 경로 이름을 사용하는 위치에 드라이버 파일을 설치하여 성공적으로 실행되도록 하십시오. 그렇지 않으면, 동일한 연결 테스트 시나리오가 성공해도 런타임 장애가 재발생할 수 있습니다.
배치 관리자 노드를 포함하여 데이터 소스에 액세스해야 하는 모든 노드가 동일한 플랫폼에서 실행되고 JDBC 드라이버가 동일한 위치에 설치된 경우에만 셀 범위 자원을 사용하십시오. 그렇지 않으면, 노드 범위를 데이터 소스의 가장 큰 범위 설정으로 사용하십시오.
변수 검색 생략
JDBC 프로바이더의 클래스 경로 항목을 하드 코드 값으로 변경하여 환경 변수 찾아보기를 생략할 수 있습니다. 그러나 이 전략은 데이터 소스가 기능해야 하는 모든 노드에서 클래스 경로를 동일하게 구성한 경우에만 성공적으로 실행됩니다.
연결 테스트 서비스 활성화
연결 테스트 서비스를 활성화하는 데는 관리 콘솔, wsadmin 도구 또는 Java 독립형 프로그램을 통한 세 가지 방법이 있습니다. 각 프로세스는 동일한 MBean에서 동일한 메소드를 호출합니다.
관리 콘솔
WebSphere Application Server는 단순히 단추를 눌러 관리 콘솔에서 연결을 테스트할 수 있게 합니다(모두 연결 테스트 단추가 있는 데이터 소스 콜렉션, 데이터 소스 설정, 버전 4 데이터 소스 콜렉션 및 버전 4 데이터 소스 설정 페이지). 데이터 소스를 정의하고 저장한 후 이 단추를 클릭하여 데이터 소스 정의의 매개변수가 올바른지 확인할 수 있습니다. 콜렉션 페이지에서 몇 가지 데이터 소스를 선택하고 한꺼번에 모두 테스트할 수 있습니다. 먼저 만족해야 하는 특정 조건이 있음을 주의하십시오. 자세한 정보는 "관리 콘솔로 연결 테스트" 주제를 참조하십시오.
server1 서버의 svtaix24Node01 노드에서 isagent 데이터 소스에 대해
다음 예외와 함께 연결 테스트가 실패했습니다. java.lang.Exception:
java.sql.SQLException: JZ006: Caught IOException: java.net.ConnectException: A
원격 호스트에서 연결 조작을 거부했습니다.DSRA0010E: SQL State = JZ006,
Error Code = 0
이 예외는 Sybase 데이터 소스 포트 번호가
Sybase 서버에 구성된 포트와 일치하지 않을 때 발생합니다. 기본
포트 번호는 5000입니다. /<sybase 설치 디렉토리>에 있는 인터페이스 파일에서 Sybase 서버의
포트 번호를 확인하십시오.WsAdmin 도구
wsadmin 도구는 WebSphere Application Server 관리 활동의 전체 범위에 대한 스크립트 인터페이스를 제공합니다. 연결 테스트 기능이 MBean의 메소드로서 구현되고 wsadmin이 MBean 메소드를 호출할 수 있기 때문에, wsadmin을 이용하여 DataSources에 대한 연결을 테스트할 수 있습니다. wsadmin을 통한 데이터 소스 연결 테스트에는 두 가지 옵션이 있습니다.
wsadmin의 AdminControl 오브젝트에는 testConnection 조작이 있어서 데이터 소스 오브젝트의 구성 특성을 테스트할 수 있습니다. 정보는 "wsadmin으로 연결 테스트" 주제를 참조하십시오.
MBean 연산을 호출하여 연결을 테스트할 수 있습니다. 이 기법의 지침으로 "wsadmin으로 데이터 소스 연결 테스트" 주제의 예제를 사용하십시오.
Java 독립형 프로그램
마지막으로, DataSourceCfgHelper MBean에서 testConnection 메소드를 실행하여 연결을 테스트할 수 있습니다. 이 메소드는 구성된 데이터 소스의 구성 ID를 전달할 수 있게 합니다. Java 프로그램은 실행 중인 JMX(Java Management Extensions) 서버에 연결하여 MBean에 액세스합니다. Application Server의 WebSphere Application Server, Network Deployment 설치에서, 일반적으로 실행 중인 포트 8879의 배치 관리자에서 실행 중인 JMX 서버에 연결합니다.
이 호출의 리턴값은 0, 양의 숫자 또는 예외입니다. 0은 작업이 경고 없이 성공적으로 완료했음을 표시합니다. 양의 숫자는 해당 번호의 경고와 함께 작업이 성공적으로 완료되었음을 표시합니다. 예외는 연결 테스트가 실패했음을 표시합니다.
다음 예제 코드는 데이터 소스 인스턴스 및 관련 연결 인스턴스를 작성하고 데이터베이스 연결성을 사용할 수 있도록 테스트합니다.
이 프로그램은 JMX를 사용하여 실행 중인 서버에 연결하고 DataSourceCfgHelper MBean에서 testConnection 메소드를 호출합니다. 주석 행의 ND는 다음 코드가 WebSphere Application Server WebSphere Application Server, Network Deployment에 적용됨을 나타냅니다. 주석 행의 Base는 다음 코드가 WebSphere Application Server에 적용됨을 나타냅니다.
/**
* Description
* Resource adapter test program to make sure that the MBean interfaces work.
* Following interfaces are tested
*
* --- testConnection()
*
*
* We need following to run
* C:\src>java -Djava.ext.dirs=C:\WebSphere\AppServer\lib;C:\WebSphere\AppServer\java\jre\lib\ext testDSGUI
* must include jre for log.jar and mail.jar, else get class not found exception
*
*
*/
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 {
//Use port 8880 for a Base installation or port 8879 for ND installation
String port = "8880";
// String port = "8879";
String host = "localhost";
final static boolean verbose = true;
// eg a configuration ID for DataSource declared at the node level for Base
private static final String resURI = "cells/cat/nodes/cat|resources.xml#DataSource_1";
// eg a 4.0 DataSource declared at the node level for Base
// private static final String resURI = "cells/cat/nodes/cat|resources.xml#WAS40DataSource_1";
// eg Apache Derby DataSource declared at the server level for Base
//private static final String resURI = "cells/cat/nodes/cat/servers/server1/resources.xml#DataSource_6";
// eg node level DataSource for ND
//private static final String resURI = "cells/catNetwork/nodes/cat|resources.xml#DataSource_1";
// eg server level DataSource for ND
//private static final String resURI = "cells/catNetwork/nodes/cat/servers/server1|resources.xml#DataSource_4";
// eg cell level DataSource for 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);
}
/**
* This method tests the ResourceMbean.
*
* @param args
* @exception Exception
*/
public void run(String[] args) {
try {
System.out.println("Connecting to the application server.......");
/*************************************************************************/
/** Initialize the 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);
}
/*************************************************************************/
/** Locate the Mbean */
/*************************************************************************/
ObjectName handle = null;
try {
// Send in a locator string
// eg for a Base installation this is enough
ObjectName queryName = new ObjectName("WebSphere:type=DataSourceCfgHelper,*");
// for ND you need to specify which node/process you would like to test from
// eg run in the server
//ND: ObjectName queryName = new OjectName
("WebSphere:cell=catNetwork,node=cat,process=server1,type=DataSourceCfgHelper,*");
// eg run in the node agent
//ND: ObjectName queryName = new ObjectName
("WebSphere:cell=catNetwork,node=cat,process=nodeagent,type=DataSourceCfgHelper,*");
//ND: eg run in the Manager
//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()) {
// use the first MBean that is found
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);
}
/*************************************************************************/
/** Build parameters to pass to 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 {
/*************************************************************************/
/** Start to test the connection to the database */
/*************************************************************************/
result = adminClient.invoke(handle, "testConnection", params, signature);
} catch (MBeanException mbe) {
// ****** all user exceptions come in here
if (verbose) {
Exception ex = mbe.getTargetException(); // this is the real exception from the 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();
}
/*************************************************************************/
/** Process the result. The result will be the number of warnings */
/** issued. A result of 0 indicates a successful connection with */
/** no warnings. */
/*************************************************************************/
//A result of 0 indicates a successful connection with no warnings.
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);
}
}
}