2010-08-17 2 views
13

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

asadmin start-database 

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

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

ответ

6

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

Вы можете создать сценарий оболочки, чтобы «пустить» начальный домен и начальную базу данных в единую команду uber-start.

+0

Это то, что я планировалось сделать, поскольку нет ничего другого. Спасибо за ответ. –

+0

Не могли бы вы предоставить пример сценария? – NonlinearFruit

9

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

+0

Да, я знаю маленький флажок, но убедитесь, что в том же диалоговом окне, что он указывает на правильное местоположение JavaDB, у меня было это неправильно, и Eclipse не смог запустить Derby, потребовалось некоторое время, чтобы его обнаружить! –

+0

Спасибо, Карл. Netbeans имеет тот же параметр, и по умолчанию он включен. – DavidS

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)); 
} 

} 
2

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

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

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

.2. Используя графический интерфейс администратора Glassfish, добавьте следующие два свойства в Конфигурации> server-config> Настройки JVM> вкладка JVM Options: -Dderby.drda.startNetworkServer=true и -Dderby.system.home=C:/java/J2EESDK7U1/glassfish/databases. Первое говорит 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

Смежные вопросы