모두,
저는 전 세계 여러 데이터베이스에서 데이터를 가져오는 스크립트를 가지고 있습니다. 이 스크립트는 예약 실행되고 자동화되어 있습니다. 즉, 스크립트가 수행할 작업을 완료하고, 모든 테이블을 저장하고, JMP를 닫고, 작업을 마칩니다.
하지만 가끔 한두 개의 데이터베이스가 응답하지 않는 경우가 있습니다. LDAP 서버가 다운되어 비밀번호를 입력해도 응답하지 않거나, 데이터베이스 유지 보수 작업 중일 때 발생합니다.
이 경우 다음과 같은 팝업 창이 나타납니다.

이 상황이 발생할 때 제가 그 자리에 있고 "취소"를 클릭하더라도 스크립트가 완료되지 않고 종료됩니다.
데이터베이스에서 데이터를 가져오는 함수를 try/catch 블록으로 감쌌는데, "취소" 버튼을 수동으로 클릭해도 해결되지 않습니다. 더 중요한 것은, 이런 경우 스크립트를 어떻게 감독 없이 실행할 수 있을까요? 데이터베이스 중 하나에 연결할 수 없으면 해당 연결을 끊고 나머지 데이터베이스에서 데이터를 가져와 처리하도록 스크립트에 어떻게 지시할 수 있을까요? 데이터베이스 하나가 응답하지 않는다고 해서 전체 스크립트 실행이 중단되는 것을 막고 싶습니다. 팝업 창을 없애고 try 블록 실패로 간주하여 catch 블록으로 이동한 후 스크립트를 계속 실행하려면 어떻게 해야 할까요?
다음은 이 문제를 일으키는 스크립트의 일부입니다.
DBPaths = [
"Server1" => "ODBC:DSN=...PORT=5432;",
"Server2" => "ODBC:DSN=...PORT=5432;",
"Server3" => "ODBC:DSN=...PORT=5432;",
"Server4" => "ODBC:DSN=...PORT=5432;",
"Server5" => "ODBC:DSN=...PORT=5432;"];
myQuery = Function( {serverDBPath, server},
New SQL Query(
Version( 130 ),
Connection( serverDBPath ),
QueryName( server ),
Select( ... ),
From( ... ),
Where( ... ),
PostQueryScript( ... )
) << Run Foreground()
);
myDTs = {};
For Each( {{server, DBPath}, index}, DBPaths,
Show( server, DBPath, index );
Try( myDTs[index] = myQuery( DBPath, server ), writeToLog( server || " Query error... Using: " || DBPath ||" Error message: "||exception_msg[1] ) );
);
감사해요,
중.
쿼리를 백그라운드에서 실행하면 도움이 될까요? 저는 반환된 데이터가 유효한지 확인하는 아래와 같은 방법을 자주 사용합니다.
쿼리를 백그라운드에서 실행하고 완료될 때까지 기다린 다음, 나머지 JSL 스크립트에서 해당 쿼리를 참조합니다.