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

a14dhokn  于 2023-05-16  发布在  Spring
关注(0)|答案(7)|浏览(201)

我想在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脚本。
你知道吗?
谢谢!

t8e9dugd

t8e9dugd1#

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客户端(如SQuirreLSQL)访问端口9092并查看相同的数据。

ubbxdtey

ubbxdtey2#

使用spring Boot ,您可以通过www.example.com文件中的几个配置来实现这application.properties一点。

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

然后您可以在http://localhost:8080/console/中访问h2 web控制台。默认登录配置应该可以正常工作,除非您更改它们。
请参见spring Boot 文档。

k4emjkb1

k4emjkb13#

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

  • 从同一进程内连接到数据库。不要启动第二个进程。
  • 使用具有硬编码绝对路径的持久化数据库,例如:`jdbc:h2:/data/db/dataSource'。
  • 更复杂/不推荐:如果启动第二个进程,理论上可以使用服务器模式连接到内存中的数据库。但这意味着您需要启动运行测试的服务器。
6jjcrrmo

6jjcrrmo4#

使用Sping 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"

kx7yvsdv

kx7yvsdv5#

当您将嵌入式deb与xml jdbc配置一起使用时,数据库的默认名称是“testdb”
尝试在您的url连接中使用:

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

cpjpxq1n6#

对于那些想要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/*" );
 );
}
6vl6ewon

6vl6ewon7#

我也面临着类似的问题。但修复的效果非常小。请参阅页面: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>

相关问题