Автоматический запуск JavaDB (Derby) на GlassFish - PullRequest
13 голосов
/ 18 августа 2010

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

asadmin start-database

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

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

Ответы [ 4 ]

9 голосов
/ 21 февраля 2012

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

6 голосов
/ 18 августа 2010

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

Вы можете создать сценарий оболочки для объединения стартового домена и стартовой базы данных в одну команду uber-start.

3 голосов
/ 05 августа 2015

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

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

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

0,2. Используя графический интерфейс администратора glassfish, добавьте следующие два свойства в «Конфигурации»> «Настройка сервера»> «Настройки JVM»> вкладка «Параметры JVM»: -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

3 голосов
/ 30 апреля 2012

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

}
...