Запустите базу данных H2 в режиме сервера через Spring

Я пытаюсь запустить базу данных 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 ответа

Решение

Есть ли у вас:

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

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

Недавно мне пришлось выполнить ту же конфигурацию, чтобы выполнить модульное тестирование и проверить данные, у меня это работает (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>

Вы уверены, что 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.

РЕДАКТИРОВАТЬ:

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

Другие вопросы по тегам