查看Spring启动的嵌入式H2数据库的内容

时间:2013-07-23 07:17:35

标签: spring h2

我想在Web浏览器中查看Spring启动的H2数据库的内容,这要归功于以下配置:

<jdbc:embedded-database id="dataSource" type="H2" />

<jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="classpath:db/populateDB.sql"/>
</jdbc:initialize-database>

我在日志中搜索了JDBC URL:

DEBUG o.s.j.d.SimpleDriverDataSource - Creating new JDBC Driver Connection to [jdbc:h2:mem:dataSource;DB_CLOSE_DELAY=-1]

这样我就可以按如下方式填写连接表单:

enter image description here

但不幸的是,db仍然是空的,而不应该是由于populateDB.sql脚本。

有什么想法吗?

谢谢!

7 个答案:

答案 0 :(得分:48)

View content of H2 or HSQLDB in-memory database几乎相同的问题。

只需在配置中添加以下内容即可。

<bean id="h2Server" class="org.h2.tools.Server" factory-method="createTcpServer" init-method="start" destroy-method="stop" depends-on="h2WebServer">
    <constructor-arg value="-tcp,-tcpAllowOthers,-tcpPort,9092"/>
</bean>
<bean id="h2WebServer" class="org.h2.tools.Server" factory-method="createWebServer" init-method="start" destroy-method="stop">
    <constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
</bean>

这将在与嵌入式数据库相同的JVM中启动H2 Web控制台和TCP服务器,以便您可以使用Web浏览器访问端口8082(输入jdbc:h2:mem:dataSource as URL)或访问端口9092外部SQL客户端如SQuirreLSQL和查看相同的数据。

答案 1 :(得分:18)

数据库URL jdbc:h2:mem:dataSource表示您正在使用内存数据库。现在,如果您启动第二个Java进程并连接到此数据库,您将最终拥有两个内存数据库(每个进程一个)。

如果要连接到现有数据库,可以有多个选项:

  • 从同一进程中连接到数据库。不要开始第二个过程。

  • 使用带有硬编码绝对路径的持久数据库,例如:`jdbc:h2:/ data / db / dataSource'。

  • 更复杂/不推荐:如果启动第二个过程,理论上可以使用服务器模式连接到内存数据库。但这意味着您需要启动运行测试的服务器。

答案 2 :(得分:18)

使用spring boot,您可以在application.properties文件中使用几个配置执行此操作。

spring.h2.console.enabled=true
spring.h2.console.path=/console/

然后您可以在http://localhost:8080/console/中访问h2 Web控制台。除非您更改默认登录配置,否则默认登录配置应该有效。

请参阅spring boot documentation

答案 3 :(得分:17)

使用Spring Boot时,您可以按如下方式注册H2 Console Servlet:

@Bean
public ServletRegistrationBean h2servletRegistration() {
    ServletRegistrationBean registration = new ServletRegistrationBean(new WebServlet());
    registration.addUrlMappings("/console/*");
    registration.addInitParameter("webAllowOthers", "true");
    return registration;
}

如果您想要远程使用控制台,重要的一行就是addInitParameter"webAllowOthers"设置为"true"

答案 4 :(得分:13)

当你使用带有xml jdbc配置的embeddeb时,数据库的默认名称是'testdb'

尝试在您的网址连接中使用:

jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1

答案 5 :(得分:3)

对于那些想要Java Config设置的人来说,在实现ServletContextInitializer和链接控制台服务器时,初始化TCP服务器也相当容易......

@Configuration
public class WebConfig implements ServletContextInitializer{
...

@Override
public void onStartup( ServletContext servletContext )
//do stuff onStartUp...
initH2TCPServer( servletContext );
....    

@Bean(initMethod="start", destroyMethod="stop")
public Server initH2TCPServer(ServletContext servletContext) {
    log.debug( "Initializing H2 TCP Server" );
    try {
        server = Server.createTcpServer( "-tcp", "-tcpAllowOthers", "-tcpPort", "9092" );
    } catch( SQLException e ) {
        e.printStackTrace();
    } finally {
        //Always return the H2Console...
        initH2Console( servletContext );
    }
    return server;
}

public void initH2Console( ServletContext servletContext ) {
    log.debug( "Initializing H2 console" );
    ServletRegistration.Dynamic h2ConsoleServlet = servletContext.addServlet(
    "H2Console", new org.h2.server.web.WebServlet() );
    h2ConsoleServlet.addMapping( "/console/*" );
 );
}

答案 6 :(得分:0)

我面临类似的问题。但是解决方法确实很小。有关更多详细信息,请参见第https://springframework.guru/using-the-h2-database-console-in-spring-boot-with-spring-security/页。

就我而言,我已将H2依赖范围添加为“运行时”。我删除了它,并解决了我的问题。不能在H2-控制台中查看表格。

我pom中以前的依赖项是:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

和新的依赖关系解决了我的问题:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>