Просмотр содержимого встроенной базы данных H2, начатой ​​Spring

Я хотел бы просмотреть в веб-браузере содержимое базы данных H2, начатую Spring, благодаря следующей конфигурации:

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

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

Я искал URL JDBC в журналах:

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 script.

Любая идея?

Спасибо!

Ответ 1

В основном такой же вопрос, как Просмотр содержимого базы данных H2 или HSQLDB в памяти.

Просто добавьте следующее в свою конфигурацию.

<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>

Это запустит как веб-консоль H2, так и TCP-сервер в той же JVM, что и ваша встроенная база данных, чтобы вы могли получить доступ к порту 8082 с вашим веб-браузером (введите jdbc: h2: mem: dataSource как URL-адрес) или порт доступа 9092 с внешний SQL-клиент, такой как SQuirreLSQL, и просматривать те же данные.

Ответ 2

При использовании Spring Boot вы можете зарегистрировать сервлет сервопривода H2 следующим образом:

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

Если вы хотите, чтобы консоль была доступна удаленно, важной строкой является addInitParameter, чтобы установить "webAllowOthers" в "true".

Ответ 3

URL-адрес базы данных jdbc:h2:mem:dataSource означает, что вы используете базу данных в памяти. Теперь, если вы начнете второй процесс Java и подключитесь к этой базе данных, у вас будет две базы данных в памяти (по одному для каждого процесса).

Если вы хотите подключиться к существующей базе данных, у вас есть несколько вариантов:

  • Подключитесь к базе данных из одного и того же процесса. Не запускайте второй процесс.

  • Используйте постоянную базу данных с жестким кодом абсолютного пути, например: `jdbc: h2:/data/db/dataSource '.

  • Сложнее/не рекомендуется: если вы начнете второй процесс, теоретически вы можете подключиться к базе данных в памяти, используя режим сервера. Но это означает, что вам нужно запустить сервер, на котором вы выполнили тест.

Ответ 4

С помощью загрузки spring вы можете сделать это с помощью пары конфигураций в файле application.properties.

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

Затем вы можете получить доступ к веб-консоли h2 в http://localhost:8080/console/. Конфигурация входа по умолчанию должна работать, если вы не измените их.

См. spring boot документация.

Ответ 5

При использовании встраивания с конфигурацией xml jdbc по умолчанию имя базы данных является "testdb"

Попробуйте использовать в своем URL-соединении:

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

Ответ 6

Для тех, кто хочет настроить Java Config, довольно просто сделать так, чтобы инициализировать TCP-сервер при реализации ServletContextInitializer и привязать консольный сервер...

@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/*" );
 );
}