在GlassFish上自动启动JavaDB(Derby)

13

我计划将开源版的 GlassFish v3 部署到生产环境中。它自带了我需要的 JavaDB(Apache Derby)。唯一的问题是,GlassFish 启动时不会默认启动 JavaDB。我需要在命令行中输入以下内容:

asadmin start-database

有没有办法使数据库在服务器(GlassFish)启动时自动启动? 我讨厌每次开发应用程序时都要手动执行这个操作,我当然不想在生产中这样做。

提前致谢

4个回答

9

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


我知道那个小复选框,但请确保在同一个对话框中指向正确的JavaDB位置,我之前设置错误了,导致Eclipse无法启动Derby,花了一段时间才发现! - EraserheadIRL
谢谢,Carl。Netbeans也有相同的选项,并且默认是启用的。 - DavidS

6

一旦您进入生产,您只需启动一次数据库并让其运行,无论应用服务器的状态如何。

您可以创建一个Shell脚本将“start-domain”和“start-database”捆绑成单个超级启动命令。


这是我计划做的事情,因为没有其他可行的选择。谢谢回复。 - del.ave
你能提供一个脚本示例吗? - NonlinearFruit

3

我的工作是将这个打包为EJB JAR,然后部署到服务器上。这样可以把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));
}

}

3
我建议利用Derby可以作为嵌入式服务器(即在应用程序服务器JVM中运行)和网络服务器(即为本地主机上默认端口1527寻址的客户端请求提供服务)这一事实。因此,你可以从嵌入式模式的性能提升中受益,同时仍然允许例如“ij”访问正在运行的服务器以管理数据,并且通过适当的安全设置从其他服务器实例通过TCP/IP进行访问。
在该配置中,Derby随应用程序服务器一起启动和停止。无需额外的命令或显式服务器启动代码来启动derby。
以下是Glassfish 4和derby/javaDB 10.10的配置说明,但在其他服务器和版本中也会类似工作。你确实需要调整下面的所有路径以匹配你自己的安装。
1. 通过添加derby.jar、derbyclient.jar、derbynet.jar和derbytools.jar,使得derby类可用于服务器“common”类加载器。例如将jar文件复制到服务器实例的JVM lib/ext中,如C:\java\J2EESDK7U1\glassfish\domains\domain1\lib\ext
2. 使用glassfish管理GUI,在Configurations > server-config > JVM settings > JVM Options选项卡中添加以下两个属性:-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
  }
}

要获得其他六个创业提示,请参见http://blog.eisele.net/2010/12/seven-ways-to-get-things-started-java.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接