我正在寻找一种在网络模式下运行Apache Derby服务器的好方法。我正在使用NetworkServerControl启动服务器,它运行良好。
我像这样启动服务器:
/**
* starts the network server
* @return true if sucessfull
*/
public boolean start()
{
try
{
// just to be sure that we don't start two servers
this.stop();
server = new NetworkServerControl();
server.start( null );
return true;
}
catch ( Exception ex )
{
this.logLogger.debug( ex );
return false;
}
}
然后像这样停下来:
/**
* stops the server
*
* @return true if there were no problems stopping the server
*/
public boolean stop()
{
try
{
if ( server == null )
{
server = new NetworkServerControl();
}
server.shutdown();
return true;
}
catch ( Exception ex )
{
this.logLogger.debug( ex );
return false;
}
}
在main()上我有这个,所以在服务器运行时进程不会消失
(...)
clsDB.start();
while( clsDB.testForConnection() )
{
Thread.sleep( 60000 );
}
testForConnection()看起来像这样:
/**
* Try to test for a connection
*
* @return true if the server is alive
*/
public boolean testForConnection()
{
try
{
server.ping();
return true;
}
catch ( Exception ex )
{
this.logLogger.debug( ex );
return false;
}
}
我的问题是,当我的JAR的新实例被调用时,旧的JAR仍将运行(除非我真的很幸运并且在新服务器启动之前进行了测试)。
我知道我可以测试服务器是否已经运行然后我不会重新启动,但如果服务器已经存在,我希望开始像重启一样工作。
答案 0 :(得分:1)
我之前用derby做了一个项目(包括在网络模式下运行),我似乎记得你可以在服务器上执行一些关闭derby的SQL。
所以,假设情况就是这样(没时间谷歌为它抱歉)你可以在启动时查找你的网络实例。如果存在,请在其上运行此SQL。一旦你确定它最终被关闭(我认为轮询它存在),你就可以再次启动它。
编辑:哦,它不是SQL,它以'shutdown = true'作为参数连接到数据库。见here:
DriverManager.getConnection(
"jdbc:derby:sample;shutdown=true");
答案 1 :(得分:0)
我提出的另一个解决方案并不与您可能不喜欢的JAR互动。
另一种方法是让启动derby实例的JAR打开一个在启动derby时监视的TCP端口。然后,您可以从新的JAR实例发送自己的关闭命令(显然在打开自己的TCP端口之前)。
启动你的德比JAR实例将是:
stop()
方法关闭德比。success
发回任何内容并关闭连接。start()
并启动Derby。这比我的其他解决方案更多,但理论上是更好的解决方案,因为作为重启的一部分,您的JAR可能也想做其他事情(清理/重启其他资源,记录它正在关闭的事实,东西那样的。)
答案 2 :(得分:0)
我们最终使用了一个在服务器被杀死时创建的文件,然后在服务器进程中我们定期检查文件是否存在,如果它在那里我们就杀了服务器。