12

我正在尝试通过 Spring 在服务器模式下启动 H2 数据库(我希望它在不同的进程中运行)。目前我正在使用 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>

我将不胜感激任何帮助/想法

4

3 回答 3

11

你碰巧有:

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

在你的 Spring 配置文件中?

于 2009-10-01T10:28:10.417 回答
3

最近我不得不做同样的配置来进行单元测试和检查数据,这对我有用(Spring 3.1.4)。然后你只需要连接 jdbc:h2:tcp://localhost:8043/mem:test 并确保在测试结束时放一个 while(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>
于 2014-02-13T18:54:39.517 回答
1

你确定类中的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 端口上进行侦听。所以看起来还不错。

于 2009-10-01T10:22:33.440 回答