2016-11-23 10 views
1

두 개의 javafx 앱과 App 및 Updater가 있습니다. 은 Firebird 데이터베이스를 사용하여 취약한 사용자 데이터를 저장합니다. 데이터베이스는 임베디드 모드에서 실행됩니다 (관련성이 있다고 생각합니다). 즉, 동시에 데이터베이스에 하나의 연결 만있을 수 있습니다 (데이터베이스는 잠금 파일을 만듭니다). 업데이터 업데이트 응용 프로그램.Java가 앱 종료시 모든 리소스를 해제하지 않습니다.

는 전체 스키마는 다음과 같습니다

  1. 사용자는 APP-> 앱은 그 다음이다가 (자바 ProcessBuilder를 사용) Updater를 시작하고 자신을 닫으면 업데이트가 필요한 경우 확인하고 있습니다 실행 (Platform.exit을 ()).
  2. 업데이터는 앱이 제대로 종료되었는지 확인합니다.
  3. Updater는 업데이트를 시작하기 전에 가장 중요한 작업을 내보내는 "App --export-user-data"명령 (ProcessBuilder 사용)을 실행합니다 (이 방법을 수행해야합니다.이 함수는 Updater로 이동할 수 없습니다).
  4. 앱은 먼저 session.beginTransaction()에 동결 - 단 하나의 오류 또는 예외가 없다

지금까지 관찰 무엇 :

  • 나는 응용 프로그램을 시작하고 [눌러 X를 닫을 때 ] "C : \ ProgramData \ firebird"의 잠금 파일은 모두 제거되지만 App 이 Updater를 시작하고 자신을 닫으면 잠금 파일은 변경되지 않습니다. 나는 그것이 Hibernate가 트랜잭션을 시작할 수없는 이유라고 생각한다. 앱이 Updater를 시작하는 경우에만 때문에 문제가 나타납니다 -
  • 업데이터의 과정이 앱의 하위 프로세스 아닌 내가 직접이 마법처럼 작동 Updater를 시작하면
  • 가 (나는이 사용하는 프로세스 모니터를 확인).

것들 내가 수행 할 수 없습니다

  • 스위치 데이터베이스를 무엇에 - 그것은
  • 이동 내보내기 기능이 나는 greatful 것

을 Updater의 파이어 버드 임베디드 수있다 이 문제를 해결하기 위해 4 일을 보냈기 때문에 이상한 아이디어를 얻었습니다.

편집 : 파이어 버드 버전 : 2.1 Jaybird 버전 : 2.1.6

방법의 업데이터가 시작 (만 필요한 일)

public void startUpdater(){ 
    ProcessBuilder pb = new ProcessBuilder(updaterPath, argument) 
    pb.start(); 
    Platform.exit(); 
} 
+0

이 코드를 재현하는 데 필요한 최소 코드를 보여주십시오. 또한 파이어 버드 임베디드 버전과 사용중인 제이 버드 버전을 포함하십시오. –

+2

코드를 보지 않고 exit()를 호출하는 대신 앱을 정상적으로 종료해야합니다. – Henry

+0

나에게 속한 것이 아니기 때문에 소스 코드를 게시 할 수는 없지만 약간의 sinippets을 제공하려고 노력할 것입니다. 나는 또한 파이어 버드에 대한 더 많은 정보를 제공 할 것이다. – straw

답변

0

나는 마침내 해결책을 가지고 긴 전투 후에. java가 새로운 프로세스를 생성 할 때, child-process는 부모로부터 모든 핸들을 상속받습니다. 그래서 파이어 버드 잠금 파일이 삭제되지 않은 것입니다. 나는 cpp에 작은 응용 프로그램을 만들고 그것을 updater를 실행할 때 프록시로 사용하여 이것을 해결했다.

#include <windows.h> 
#include <stdio.h> 
#include <tchar.h> 

int _tmain(int argc, TCHAR *argv[]) 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 

    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 

    if(argc != 2) 
    { 
     printf("Usage: %s [cmdline]\n", argv[0]); 
     return 0; 
    } 

    // Start the child process. 
    if(!CreateProcess(NULL, // No module name (use command line) 
     argv[1],  // Command line 
     NULL,   // Process handle not inheritable 
     NULL,   // Thread handle not inheritable 
     FALSE,   // Set handle inheritance to FALSE 
     0,    // No creation flags 
     NULL,   // Use parent's environment block 
     NULL,   // Use parent's starting directory 
     &si,   // Pointer to STARTUPINFO structure 
     &pi)   // Pointer to PROCESS_INFORMATION structure 
    ) 
    { 
     printf("CreateProcess failed (%d).\n", GetLastError()); 
     return 0; 
    } 

}