55

由于以下配置,我想在 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]

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

在此处输入图像描述

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

任何想法?

谢谢!

4

7 回答 7

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 作为 URL),或使用外部 SQL 客户端访问端口 9092如 SQuirreLSQL 并查看相同的数据。

于 2013-11-13T18:29:06.460 回答
26

使用 Spring Boot,您可以通过 application.properties 文件中的几个配置来执行此操作。

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

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

请参阅弹簧引导文档

于 2016-08-23T18:37:36.227 回答
20

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

如果要连接到现有数据库,您有多种选择:

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

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

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

于 2013-07-23T07:49:44.680 回答
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"

于 2015-10-25T01:57:53.250 回答
14

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

尝试在您的 url 连接中使用:

jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
于 2013-07-25T09:55:37.440 回答
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/*" );
 );
}
于 2015-02-22T11:19:57.047 回答
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>
于 2019-03-09T18:40:34.583 回答