Просмотр содержимого встроенной базы данных 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/*" );
);
}