我有两个javafx应用程序,一个应用程序和更新程序。 应用使用Firebird数据库存储一些脆弱的用户数据。数据库以嵌入模式运行(我认为它是相关的),这意味着同时只能有一个与数据库的连接(数据库创建一个锁文件)。 更新程序更新应用程序。
整个架构如下所示:
到目前为止我所观察到的:
我无法做的事情:
我会为最奇怪的想法而感到高兴,因为我花了四天时间试图解决这个问题。
修改 火鸟版:2.1 Jaybird版本:2.1.6
启动Updater的方式(仅限必要的东西)
public void startUpdater(){
ProcessBuilder pb = new ProcessBuilder(updaterPath, argument)
pb.start();
Platform.exit();
}
答案 0 :(得分:0)
经过长时间的战斗,我终于得到了解决方案。当java创建一个新进程时,子进程从它的父进程继承所有句柄。这就是火鸟锁文件尚未被删除的原因。我通过在cpp中创建小应用程序并在运行更新程序时将其用作代理来解决这个问题。
#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;
}
}