我计划将 GlassFish v3 开源版部署到生产环境。它带有 JavaDB (Apache Derby),这正是我所需要的。唯一的问题是 GlassFish 启动时默认不启动 JavaDB。我将不得不去命令行并输入:
asadmin start-database
有没有办法让数据库在服务器(GlassFish)启动时自动启动?我讨厌每次在开发应用程序时手动执行此操作,而且我当然不想在生产中执行此操作。
提前致谢
我计划将 GlassFish v3 开源版部署到生产环境。它带有 JavaDB (Apache Derby),这正是我所需要的。唯一的问题是 GlassFish 启动时默认不启动 JavaDB。我将不得不去命令行并输入:
asadmin start-database
有没有办法让数据库在服务器(GlassFish)启动时自动启动?我讨厌每次在开发应用程序时手动执行此操作,而且我当然不想在生产中执行此操作。
提前致谢
这有点过时了,但在 Eclipse 首选项的 GlassFish 部分中有一个复选框,标题为“启动 GlassFish Server 时启动 JavaDB 数据库进程”。我正在运行 Eclipse Indigo SR1。
投入生产后,无论应用服务器的状态如何,您都可以启动数据库一次并让它继续运行。
您可以创建一个 shell 脚本来将 start-domain 和 start-database “捆绑”到单个 uber-start 命令中。
这就是我所做的,我将它部署到打包为 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));
}
}
我建议利用 Derby 既可以作为嵌入式服务器(即在应用程序服务器 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,将以下两个属性添加到 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
在启动时加载类。实现这一点的一种方法是,例如用 注释 EJB @Startup
,然后@PostConstruct
在 EJB 中定义一个带注释的方法,类似:
@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 个启动技巧,请参阅http://blog.eisele.net/2010/12/seven-ways-to-get-things-started-java.html