我想在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]
这样我就可以按如下方式填写连接表单:
但不幸的是,db仍然是空的,而不应该是由于populateDB.sql脚本。
有什么想法吗?
谢谢!
答案 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>