在GlassFish上自动启动JavaDB(Derby)

在GlassFish上自动启动JavaDB(Derby),glassfish,derby,glassfish-3,javadb,Glassfish,Derby,Glassfish 3,Javadb,我计划将GlassFish v3开源版部署到生产环境中。它附带了JavaDB(ApacheDerby),这正是我所需要的。唯一的问题是,当GlassFish启动时,默认情况下JavaDB没有启动。我必须转到命令行并输入: asadmin start-database 是否有一种方法可以使数据库在服务器(GlassFish)启动时自动启动?我讨厌每次开发应用程序时都手工操作,我当然不想在生产中这样做 提前感谢一旦投入生产,您就可以启动数据库一次,然后让它继续运行,而不管应用程序服务器的状态如何

我计划将GlassFish v3开源版部署到生产环境中。它附带了JavaDB(ApacheDerby),这正是我所需要的。唯一的问题是,当GlassFish启动时,默认情况下JavaDB没有启动。我必须转到命令行并输入:

asadmin start-database
是否有一种方法可以使数据库在服务器(GlassFish)启动时自动启动?我讨厌每次开发应用程序时都手工操作,我当然不想在生产中这样做


提前感谢

一旦投入生产,您就可以启动数据库一次,然后让它继续运行,而不管应用程序服务器的状态如何


您可以创建一个shell脚本,将启动域和启动数据库“捆绑”到单个uber start命令中。

这有点过时,但Eclipse首选项中的GlassFish部分有一个复选框,标题为“启动GlassFish服务器时启动JavaDB数据库进程”。我正在运行EclipseIndigoSR1。

这就是我要做的,我将它部署到打包为EJBJAR的服务器上。这将使Derby服务器能够作为自己的企业应用程序启动

import java.io.PrintWriter;

import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;

import org.apache.derby.impl.drda.NetworkServerControlImpl;

@Singleton
@Startup
public class LocalDatabase {

private NetworkServerControlImpl networkServerControlImpl = null;

@PostConstruct
private void init() throws Exception {
    networkServerControlImpl = new NetworkServerControlImpl();
    networkServerControlImpl.start(new PrintWriter(System.out));
}

}

我建议利用Derby既可以作为嵌入式服务器(即在app server JVM中运行)也可以作为网络服务器(即为本地主机发送到默认端口1527的客户端请求提供服务)的优势。因此,您可以从嵌入式模式的性能提高中获益,但仍然允许在服务器运行时从“ij”访问以管理数据,以及通过TCP/IP访问其他具有适当安全设置的服务器实例。 在该配置中,Derby与应用服务器一起启动和停止。启动derby不需要额外的命令或显式的服务器启动代码

下面描述了Glassfish 4和derby/javaDB 10.10的配置,但在其他服务器和版本中也可以使用类似的配置。您确实需要调整下面的所有路径,以与您自己的安装相匹配

.1。通过添加derby.jar、derbyclient.jar、derbynet.jar、derbytools.jar,使derby类可供服务器“公共”类加载器使用。例如,将jar实例复制到服务器实例的JVM lib/ext中,例如复制到
C:\java\J2EESDK7U1\glassfish\domains\domain1\lib\ext

.2。使用glassfish管理GUI,将以下两个属性添加到配置>服务器配置>JVM设置>JVM选项选项卡:
-Dderby.drda.startNetworkServer=true
-Dderby.system.home=C:/java/J2EESDK7U1/glassfish/databases
。第一个命令告诉Derby在加载嵌入式引擎时开始在网络模式下侦听,第二个命令提供Derby数据库的基本路径和可选的Derby.properties文件(例如,PROD中的安全设置)

.3。安排服务器在启动时加载类
org.apache.derby.jdbc.EmbeddedDriver
。实现这一点的一种方法是,例如用
@Startup
注释EJB,然后在EJB中定义
@PostConstruct
注释方法,类似于:

@PostConstruct
private void startup() {
  try { Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      logger.info("Started DERBY in embedded+network mode");
  } catch (ClassNotFoundException e) {
      ... your error handling
  }
}

关于其他6个创业技巧,请参见

这是我计划做的,因为没有其他可能。感谢您的回复。您能提供一个示例脚本吗?是的,我知道这个小复选框,但请确保在它指向正确JavaDB位置的同一个对话框中,我犯了错误,Eclipse无法启动Derby,需要一段时间才能发现!谢谢,卡尔。Netbeans有相同的选项,默认情况下是启用的。