Автоматически запускать JavaDB (Derby) на GlassFish

Я планирую развернуть GlassFish v3 с открытым исходным кодом в производственной среде. Он поставляется с JavaDB (Apache Derby), который именно то, что мне нужно. Единственная проблема заключается в том, что JavaDB не запускается по умолчанию при запуске GlassFish. Мне нужно будет перейти в командную строку и ввести:

asadmin start-database

Есть ли способ запустить базу данных автоматически при запуске сервера (GlassFish)? Я ненавидел делать это вручную каждый раз, пока я разрабатывал свое приложение, и я, конечно же, не хочу этого делать на производстве.

Заранее спасибо

Ответы

Ответ 1

Как только вы входите в производство, вы можете запустить db один раз и просто оставить его работающим, независимо от состояния сервера приложений.

Вы можете создать оболочку script для 'bundle' start-domain и start-database в одну команду uber-start.

Ответ 2

Это немного датировано, но есть флажок в разделе GlassFish в настройках Eclipse под названием "Запустите процесс базы данных JavaDB при запуске GlassFish Server". Я запускаю Eclipse Indigo SR1.

Ответ 3

Это то, что я делаю, я развертываю его на сервере, упакованном как JJB JJB. Это позволит запустить сервер 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));
}

}

Ответ 4

Я бы посоветовал воспользоваться тем, что Derby может выполнять как встроенный сервер (т.е. работать в JVM сервера приложений) и сетевой сервер (т.е. обслуживающий клиент запросы, адресованные порту 1527 по умолчанию от локального хоста). Поэтому вы получаете преимущества от расширенных характеристик встроенного режима, но все же допускаете доступ, например, "ij" для администрирования данных во время работы сервера и из других экземпляров сервера через TCP/IP с подходящими настройками безопасности. В этой конфигурации Derby запускается и останавливается вместе с сервером приложений. Нет необходимости в дополнительных командах или явном стартовом коде сервера для запуска дерби.

Конфигурация описана ниже для Glassfish 4 и derby/javaDB 10.10, но будет работать аналогично на других серверах и версиях. Вы должны настроить все пути ниже, чтобы они соответствовали вашей собственной установке.

0,1. Сделайте классы дерби доступными для серверного "обычного" загрузчика классов, добавив derby.jar, derbyclient.jar, derbynet.jar, derbytools.jar. Скопируйте jar, например, в JVM lib/ext вашего экземпляра сервера, например. в C:\java\J2EESDK7U1\glassfish\domains\domain1\lib\ext

0,2. Используя графический интерфейс администратора Glassfish, добавьте следующие два свойства в конфигурацию > server-config > JVM settings > вкладка JVM Options: -Dderby.drda.startNetworkServer=true и -Dderby.system.home=C:/java/J2EESDK7U1/glassfish/databases. Первое говорит Derby, чтобы начать прослушивание в сетевом режиме, когда загружен встроенный движок, второй поставляет основной путь к вашим базам данных derby и дополнительному файлу derby.properties(например, с вашими настройками безопасности в PROD)

0,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