【问题标题】:Apache Derby as a Windows ServiceApache Derby 作为 Windows 服务
【发布时间】:2014-07-21 14:20:09
【问题描述】:

我需要将 Apache Derby 服务器作为服务运行,以便 Derby 与安装它的机器一起启动。

现在,根据我的研究,我尝试了三种解决方案来创建这样的服务,但它们都不可行或产生错误。

  1. 使用 Java Service Wrapper:这是不可行的,因为他们只提供 30 天的免费试用。

  2. 使用 Windows 服务器管理器 (SrvMgr.exe) 创建如下所述的服务:http://www.vogella.com/tutorials/ApacheDerby/article.html。这似乎可行,因为我创建了一个显示在 Windows 注册表中的服务,可以通过“服务”面板启动/停止,并且正在使用 http://localhost:1527 Derby 服务器的默认地址。但是,如果我尝试通过 eclipse (luna) 或控制台连接到数据库,则会出现错误:

    Could not connect to DerbyPersistenceDeploy.
    Error creating SQL Model Connection connection to DerbyPersistenceDeploy. 
    (Error: DERBY SQL error: ERRORCODE: 40000, SQLSTATE: XJ041, SQLERRMC: 
    Failed to create database 'persistence', see the next exception for
    details.::SQLSTATE: XBM0J)
    DERBY SQL error: ERRORCODE: 40000, SQLSTATE: XJ041, SQLERRMC: 
    Failed to create database 'persistence', see the next exception for
    details.::SQLSTATE: XBM0J
    Error creating JDBC Connection connection to DerbyPersistenceDeploy. 
    (Error: DERBY SQL error: ERRORCODE: 40000, SQLSTATE: XJ041, SQLERRMC: 
    Failed to create database 'persistence', see the next exception for 
    details.::SQLSTATE: XBM0J)
    DERBY SQL error: ERRORCODE: 40000, SQLSTATE: XJ041, SQLERRMC: 
    Failed to create database 'persistence', see the next exception for             
    details.::SQLSTATE: XBM0J 
    

    这是服务注册表项的图像:

  3. 我绑定的最后一种方法是使用 Apache procrun (http://commons.apache.org/proper/commons-daemon/procrun.html)。我完成了本教程 (http://joerglenhard.wordpress.com/2012/05/29/build-windows-service-from-java-application-with-procrun/) 并设法让示例服务运行。但是,当我尝试调整教程中发布的脚本时,出现以下错误(来自日志文件):

    [2014-07-21 16:52:20] [error] [ 3708] 
    Method 'static void start(String[])' not found in Class org/apache/derby/drda/NetworkServerControl
    [2014-07-21 16:52:20] [error] [ 6228] 
    Failed to start Java
    [2014-07-21 16:52:20] [error] [ 6228] 
    ServiceStart returned 4
    [2014-07-21 16:52:20] [error] [ 6228] 
    Commons Daemon procrun failed with exit value: 3 (Failed to run service as console application)
    

    这是我为创建 web 服务而改编的脚本:

    set SERVICE_NAME=DerbyPersistenceService
    set PR_INSTALL=D:\Program-Files\commons-daemon-1.0.15-bin-windows\prunsrv.exe
    
    REM Service log configuration
    set PR_LOGPREFIX=%SERVICE_NAME%
    set PR_LOGPATH=D:\04_server\derby\DerbyServiceScript\logs
    set PR_STDOUTPUT=D:\04_server\derby\DerbyServiceScript\logs\stdout.txt
    set PR_STDERROR=D:\04_server\derby\DerbyServiceScript\logs\stderr.txt
    set PR_LOGLEVEL=Error
    
    REM Path to java installation
    set PR_JVM=C:\Program Files (x86)\Java\jdk1.7.0_65\jre\bin\client\jvm.dll
    set PR_CLASSPATH=%DERBY_HOME%/lib/derby.jar;
                     %DERBY_HOME%/lib/derbynet.jar;
                     %DERBY_HOME%/lib/derbyclient.jar;
                     %DERBY_HOME%/lib/derbytools.jar
    
    REM Startup configuration
    set PR_STARTUP=auto
    set PR_STARTMODE=jvm
    set PR_STARTCLASS=org.apache.derby.drda.NetworkServerControl
    set PR_STARTPARAM=start
    set PR_STARTMETHOD=main
    
    REM Shutdown configuration
    set PR_STOPMODE=jvm
    set PR_STOPCLASS=org.apache.derby.drda.NetworkServerControl
    set PR_STOPPARAM=shutdown
    set PR_STOPMETHOD=main
    
    REM JVM configuration
    set PR_JVMMS=256
    set PR_JVMMX=1024
    set PR_JVMSS=4000
    set PR_JVMOPTIONS=-Duser.language=US;-Duser.region=en
    REM Install service 
    D:\Program-Files\commons-daemon-1.0.15-bin-windows\prunsrv.exe //IS//%SERVICE_NAME%
    

    我认为此错误源于 Startup- 和 Shutdown-Configurations 配置不正确,但我不知道它们应该是什么样子。

如果有人知道方法 2. 或 3 的解决方案。我将不胜感激。

问候

[edit1:] 我按照 Bryan Pendleton 的建议编辑了我的 Procrun 脚本。

[edit2:]服务给了我一个新的错误信息:

stderr.txt:

    2014-07-23 16:41:14 Commons Daemon procrun stderr initialized

stdout.txt:

    2014-07-23 16:41:14 Commons Daemon procrun stdout initialized
    Wed Jul 23 16:41:14 CEST 2014 : No command given.
    Usage: NetworkServerControl <commands> 
    Commands:
    start [-h <host>] [-p <port number>] [-noSecurityManager] [-ssl <ssl mode>]
    shutdown [-h <host>][-p <port number>] [-ssl <ssl mode>] [-user <username>] [-password <password>]
    ping [-h <host>][-p <port number>] [-ssl <ssl mode>]
    sysinfo [-h <host>][-p <port number>] [-ssl <ssl mode>]
    runtimeinfo [-h <host>][-p <port number>] [-ssl <ssl mode>]
    logconnections { on|off } [-h <host>][-p <port number>] [-ssl <ssl mode>]
    maxthreads <max>[-h <host>][-p <port number>] [-ssl <ssl mode>]
    timeslice <milliseconds>[-h <host>][-p <port number>] [-ssl <ssl mode>]
    trace { on|off } [-s <session id>][-h <host>][-p <port number>] [-ssl <ssl mode>]
    tracedirectory <trace directory>[-h <host>][-p <port number>] [-ssl <ssl mode>]

DerbyPersistenceService.2014-07-23.log 为空。

我认为方法参数有问题。

[edit3:]更改了脚本,使其成为可行的解决方案。非常感谢 Bryan Pendleton 帮助我完成这个。

    set SERVICE_NAME=DerbyPersistenceService
    set PR_INSTALL=D:\Program-Files\commons-daemon-1.0.15-bin-windows\prunsrv.exe

    REM Service log configuration
    set PR_LOGPREFIX=%SERVICE_NAME%
    set PR_LOGPATH=D:\04_server\derby\DerbyServiceScript\logs
    set PR_STDOUTPUT=D:\04_server\derby\DerbyServiceScript\logs\stdout.txt
    set PR_STDERROR=D:\04_server\derby\DerbyServiceScript\logs\stderr.txt
    set PR_LOGLEVEL=Error

    REM Path to java installation
    set PR_JVM=C:\Program Files (x86)\Java\jdk1.7.0_65\jre\bin\client\jvm.dll
    set PR_CLASSPATH=%DERBY_HOME%/lib/derby.jar;
                     %DERBY_HOME%/lib/derbynet.jar;
                     %DERBY_HOME%/lib/derbyclient.jar;
                     %DERBY_HOME%/lib/derbytools.jar

    REM Startup configuration
    set PR_STARTUP=auto
    set PR_STARTMODE=jvm
    set PR_STARTCLASS=org.apache.derby.drda.NetworkServerControl
    set PR_STARTPARAMS=start
    set PR_STARTMETHOD=main

    REM Shutdown configuration
    set PR_STOPMODE=jvm
    set PR_STOPCLASS=org.apache.derby.drda.NetworkServerControl
    set PR_STOPPARAMS=shutdown
    set PR_STOPMETHOD=main

    REM JVM configuration
    set PR_JVMMS=256
    set PR_JVMMX=1024
    set PR_JVMSS=4000
    set PR_JVMOPTIONS=-Duser.language=US;-Duser.region=en
    REM Install service 
    D:\Program-Files\commons-daemon-1.0.15-bin-windows\prunsrv.exe //IS//%SERVICE_NAME%  

【问题讨论】:

  • 你在这些文件中得到了什么: set PR_LOGPATH=D:\04_server\derby\DerbyServiceScript\logs set PR_STDOUTPUT=D:\04_server\derby\DerbyServiceScript\logs\stdout.txt set PR_STDERROR=D :\04_server\derby\DerbyServiceScript\logs\stderr.txt
  • 好的,我查看了日志文件。错误代码 4 源于仍然安装旧服务的事实。在我卸载了以前的服务并使用更新的脚本安装了新的服务后,我收到了不同的错误消息。将更新帖子
  • procrun 的文档似乎表明它是 PR_STARTPARAMS,而不是 PR_STARTPARAM。您是否尝试设置 PR_STARTPARAMS?
  • 谢谢它现在正在工作。我接受了你的解决方案。我这边犯了愚蠢的错误。

标签: java windows-services derby procrun


【解决方案1】:

我相信 PR_STARTMETHOD 和 PR_STOPMETHOD 应该是'main',因为你想调用 NetworkServerControl 的 main() 方法。

我相信 'start' 和 'shutdown' 是您需要传递给 main() 方法的参数

所以他们应该分别进入 STARTPARAMS 和 STOPPARAMS。

【讨论】:

  • 感谢您的回复。我试图将您的建议纳入我的解决方案,但我仍然收到一条错误消息(请参阅上面的更新帖子)。
【解决方案2】:

我遇到了同样的问题,并尝试使用各种工具和包装器将 Derby 作为 Windows 服务,其中包括 Derby wiki (http://wiki.apache.org/db-derby/DerbyWindowsService) 中描述的所有方式。

无论如何,除了 Appache Foundation 提供的 procrun 工具之外,这些工具都没有对我有用,它在 tomcat 中用于将此服务器作为 Windows 服务器。所以,请按照以下步骤操作:

  1. 获取procrun的两个key文件(http://commons.apache.org/proper/commons-daemon/binaries.html):
    • prunsrv.exe - 将应用程序作为服务运行的服务应用程序。
    • prunmgr.exe - 用于监控和配置已安装服务的 GUI 管理器应用程序。
  2. 将这些文件复制到 Derby/bin(假设您有一个名为 Derby 的文件夹,即 DERBY_HOME)。
  3. 要遵循 procrun 约定,请将这些文件重命名为 derby.exe 和 derbyw.exe。如果您想使用不同的名称,您可以,但您应该修改随附的脚本。
  4. 要在 Windows 上创建服务,您必须执行下一个脚本。它被编写为在 Derby 文件夹的上级文件夹 (..) 上执行,并使用 java 32 位的可移植版本。

    • 注意:我已将其拆分为不同的行,但它只能在一行中执行

    Derby\bin\derby.exe //IS//DerbyService
    --DisplayName="德比服务"
    --Description="这是一个 Derby 数据库服务器"
    --Install="%cd%\Derby\bin\derby.exe" --Startup=auto
    --JavaHome "%cd%\Java_32_portable"
    --Jvm="%cd%\Java_32_portable\bin\client\jvm.dll"
    --StartMode=Java --StopMode=Java
    --StartClass=org.apache.derby.drda.NetworkServerControl --StartParams=start
    --StopClass=org.apache.derby.drda.NetworkServerControl --StopParams=shutdown
    --Classpath="%cd%\Derby\lib\derby.jar;%cd%\Derby\lib\derbyrun.jar;%cd%\Derby\lib\derbynet.jar;%cd%\Derby\lib\derbytools .jar"
    ++JvmOptions="-Dderby.system.home=%cd%\Derby;-Dderby.install.url=%cd%\Derby\lib;-Dderby.authentication.provider=BUILTIN;-Dderby.storage. pageCacheSize=8000;-Dderby.storage.pageSize=20000;-Dderby.database.sqlAuthorization=false"

  5. 重要。您应该调整粗体部分。

    • 适当设置您的 JAVA_HOME 变量和 jvm.dll
    • 在 ++JvmOptions 中设置您自己的 Derby 特定参数,用“;”分隔。例如,使用以下命令添加用户密码验证:
      -Dderby.database.sqlAuthorization=true;-Dderby.user."user-name"=password
  6. 最后,您可以检查您的服务是否正常启动

    net start DerbyService

建议:您可以像我一样将所有内容放在一个 bat 文件中,您可以在其中定义先前的 JAVA_HOME 或任何其他必要的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多