Запустите базу данных H2 в режиме сервера через Spring - PullRequest
11 голосов
/ 01 октября 2009

Я пытаюсь запустить базу данных H2 в режиме сервера (я хочу, чтобы она запускалась в другом процессе) через Spring. В настоящее время я использую java Runnable.exec для запуска базы данных h2 (с помощью команды: " java -cp h2.jar org.h2.tools.Server ")

Я знаю, что есть способ сделать это через Spring. Я попытался добавить следующее в конфигурацию Spring, но это не сработало (не запустило базу данных H2):

    <bean id="org.h2.tools.Server" class="org.h2.tools.Server"
        factory-method="createTcpServer" init-method="start" destroy-method="stop">
        <constructor-arg value="-tcp,-tcpAllowOthers,true,-tcpPort,8043" />
    </bean>

    <bean id="org.h2.tools.Server-WebServer" class="org.h2.tools.Server"
        factory-method="createWebServer" init-method="start">
        <constructor-arg value="-web,-webAllowOthers,true,-webPort,8082" />
    </bean>

Буду признателен за любую помощь / идеи

Ответы [ 3 ]

11 голосов
/ 01 октября 2009

У вас есть:

<beans default-lazy-init="true" ...

в ваших конфигурационных файлах Spring?

3 голосов
/ 13 февраля 2014

Недавно мне пришлось сделать ту же конфигурацию, чтобы выполнить модульное тестирование и проверить данные, это работает для меня (Spring 3.1.4). Тогда вам просто нужно соединиться с помощью jdbc: h2: tcp: // localhost: 8043 / mem: test и убедиться, что в конце теста ставится некоторое время (true) {}.

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.h2.Driver"/>
    <!--property name="url" value="jdbc:h2:mem:;TRACE_LEVEL_FIlE=4"/-->
    <property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
</bean>
<bean class="org.h2.tools.Server" factory-method="createTcpServer" init-method="start" destroy-method="stop">
    <constructor-arg>
        <array>
            <value>-tcp</value>
            <value>-tcpAllowOthers</value>
            <value>-tcpPort</value>
            <value>8043</value>
        </array>
    </constructor-arg>
</bean>
1 голос
/ 01 октября 2009

Вы уверены, что метод createTcpServer в классе Server действительно вызывается? Вы пытались установить точку останова там?

Руководство по H2 утверждает, что вы можете программно создать и запустить сервер:

import org.h2.tools.Server;
...
// start the TCP Server
Server server = Server.createTcpServer(args).start();
...
// stop the TCP Server
server.stop();

Кажется, ваше определение Spring имитирует ту же инициализацию. Но вы всегда можете попробовать сделать это вручную - возможно, это какая-то ошибка в конфигурации Spring.

EDIT:

Я попробовал вашу конфигурацию, и она работает для меня. Что заставляет вас думать, что сервер не запущен? Он ничего не выводит на стандартный вывод, однако процесс прослушивает порт 8043. Так что, похоже, все в порядке.

...