我有两个javafx应用程序App和Updater。
应用程序使用Firebird数据库存储一些易碎的用户数据。数据库以嵌入式模式运行(我认为这是相关的),因此这意味着一次只能与数据库建立一个连接(数据库创建一个锁定文件)。
更新程序更新应用程序。

整个架构如下所示:


用户运行App-> App正在检查是否需要更新,然后启动Updater(使用java ProcessBuilder)并自行关闭(Platform.exit())。
更新程序检查App是否已正确终止。
Updater运行命令“ App --export-user-data”(也使用ProcessBuilder)在开始更新之前导出最重要的内容(必须以这种方式完成-我无法将此功能移至Updater)。
应用在第一个session.beginTransaction()时冻结-没有任何错误或异常


到目前为止,我观察到的是:


当我启动App并按[X]将其关闭时,全部
来自“ C:\ ProgramData \ firebird”的锁定文件已删除,但在应用程序中
启动Updater并自行关闭,然后锁定文件保持不变。我认为这就是Hibernate无法开始交易的原因。
更新程序的过程不是App的子过程(我使用过程监视器检查了此过程)
当我直接启动Updater时,它就像一个咒语-因此,问题仅在App启动Updater时出现。


我不能做的事情:


将数据库切换到其他任何数据库-它必须已嵌入firebird
将导出功能移到Updater


即使是最奇怪的想法,我也都会感激不尽,因为我花了四天的时间来解决这个问题。

编辑:
火鸟版本:2.1
Jaybird版本:2.1.6

启动Updater的方式(仅必要的操作)

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

最佳答案

经过长时间的战斗,我终于有了解决方案。当java创建新进程时,子进程将从其父级继承所有句柄。这就是为什么firebird锁定文件没有被删除的原因。我通过在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;
    }

}

10-08 14:18