Подтвердить что ты не робот

Как показать содержимое локальной базы данных h2 (веб-консоль)?

Недавно я присоединился к новой команде, и здесь ребята используют h2 для обслуживания заглушки.

Мне было интересно, могу ли я показать содержимое этой базы данных с помощью веб-интерфейса. На работе можно перейти к localhost:5080

У меня есть проект, где я использую базу данных h2, но я не вижу веб-консоль h2, когда я нажимаю localhost:5080

Я пробовал также localhost:8082 - он тоже не работает.

Моя конфигурация проекта (работает успешно):

     <bean id="wrappedDataSource" class="net.bull.javamelody.SpringDataSourceFactoryBean">
        <property name="targetName" value="dataSource" />
     </bean>

     <bean id="wrappedDataSource" class="net.bull.javamelody.SpringDataSourceFactoryBean">
            <property name="targetName" value="dataSource" />
        </bean>

        <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
            <property name="driverClassName" value="org.h2.Driver" />
            <property name="url" value="jdbc:h2:~/test;MODE=PostgreSQL" />
            <property name="username" value="sa" />
            <property name="password" value="" />
        </bean>

        <bean id="sessionFactory"
              class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="wrappedDataSource"/>
            <property name="configLocation">
                <value>classpath:hibernate-test.cfg.xml</value>
            </property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.show_sql">false</prop>
                    <prop key="hibernate.connection.charSet">UTF-8</prop>
                    <prop key="hibernate.format_sql">true</prop>
                    <prop key="hbm2ddl.auto">create-drop</prop>
                </props>
            </property>
        </bean>

        <context:property-placeholder location="classpath:jdbc.properties"/>

У меня нет идей по доступу к веб-консоли h2. пожалуйста, помогите.

P.S.

Я вижу упоминания h2 только в папке .m2

P.S.2

Я заметил, что веб-консоль доступна http://localhost:8082/, если заменить url в конфигурации с помощью:

<property name="url" value="jdbc:h2:tcp://localhost/~/test;MODE=PostgreSQL" />

Но он работает, если я уже запускаю h2 (в .m2 папке find h2 jar файл и нажмите двойной щелчок)

Если h2 не запускается при запуске приложения - я вижу следующую ошибку:

java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:94)
    ...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dbInitializer': Invocation of init method failed; nested exception is org.hibernate.exception.GenericJDBCException: Could not open connection
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136)
    ...
Caused by: org.hibernate.exception.GenericJDBCException: Could not open connection
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
    ...
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Соединение разорвано: "java.net.ConnectException: Connection refused: connect: localhost"
Connection is broken: "java.net.ConnectException: Connection refused: connect: localhost" [90067-182])
    at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
    ...
Caused by: org.h2.jdbc.JdbcSQLException: Соединение разорвано: "java.net.ConnectException: Connection refused: connect: localhost"
Connection is broken: "java.net.ConnectException: Connection refused: connect: localhost" [90067-182]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    ...
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    ...

Я хочу, чтобы этот h2 запускался, если он не запускался при запуске приложения.

P.S.3

Я попытался написать следующий код:

Server server = null;
try {
    server = Server.createTcpServer("-tcpAllowOthers").start();
    Class.forName("org.h2.Driver");
    Connection conn = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test;MODE=PostgreSQL", "sa", "");
 } catch (Exception e) {
    LOG.error("Error while initialize", e);
 }

Я выполняю его и после того, как я пытаюсь ввести localhost:9092 в свой браузер.

В данный момент загружается файл. внутри создайте следующий контент:

Version mismatch, driver version is "0" but server version is "15"

my h2 version 1.4.182

P.S.4

Этот код работает:

public class H2Starter extends ContextLoaderListener {
    private static final Logger LOG = LoggerFactory.getLogger(H2Starter.class);

    @Override
    public void contextInitialized(ServletContextEvent event) {

        startH2();
        super.contextInitialized(event);
    }

    private static void startH2() {

        try {
            Server.createTcpServer("-tcpAllowOthers").start();
            Class.forName("org.h2.Driver");
            DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test;MODE=PostgreSQL;AUTO_SERVER=TRUE", "sa", "");

            Server.createWebServer().start();
        } catch (Exception e) {
            LOG.error("cannot start H2 [{}]", e);
        }
    }

    public static void main(String[] args) {
        startH2();
    }
}

но мне нужно вызвать его только тогда, когда конкретный профиль spring активен (теперь он работает всегда)

4b9b3361

Ответ 1

Разделим вопрос на две части.

В зависимости от того, как вы укажете соединение с H2, вы получите разные режимы работы.

Режимы: встроенный, встроенный, сервер.

jdbc:h2:~/test предоставляет вам экземпляр H2 в встроенном режиме. Вложенный режим имеет ограничение на доступность только через тот же загрузчик классов и тот же JVM (proof)

jdbc:h2:mem:test получает экземпляр H2 в памяти. Это также не доступно из внешнего мира.

jdbc:h2:tcp://localhost/test запустит сервер H2 и будет доступен извне JVM серверный режим, но с одно ограничение - сервер должен быть запущен до того, как будет выполнено соединение.

Последнее ограничение вызывает исключение Connection refused: connect: localhost".

Суммировать все:

  • запустите сервер H2 до, вы запускаете приложение
  • используйте jdbc:h2:tcp://localhost/test в качестве строки подключения
  • ....
  • счастливое кодирование:)

Обновление

Только что заметил, что вы хотите запустить сервер в процессе запуска приложения.

Вы можете сделать это несколькими способами, в зависимости от того, как вы запускаете приложение:

  • Если вы используете maven/ gradle, вам проще добавить некоторый профиль/задачу, чтобы он выполнялся до того, как приложение действительно запустится.
  • Если вам нужно настроить все в java, я предлагаю вам посмотреть question

Обновление 2

Если подключение к локальной базе данных необходимо только для разработки/отладки, я бы установил все, используя профиль maven. Ответ от этот вопрос решит это.

Если вам нужен доступ к базе данных H2 в процессе производства (вряд ли я могу представить себе случай использования), лучше сделать это в spring. Главным образом, поскольку установка контейнера/среды приложения может быть разной в производстве (по сравнению с средой разработки).

Чтобы решить вопрос о том, следует ли запускать сервер вне контекста Spring или нет, все зависит от требований. Следует отметить, что сервер должен быть запущен до, источник данных запускается (в противном случае контекст Spring не загружается)

Обновление 3

К сожалению, я не могу дать вам рабочее решение, но, согласно JavaDocs, существует разница между TCP-сервером и веб-сервером. Познакомьтесь с JavaDoc класса H2 Server.

Я думаю, вы должны использовать метод Server.createWebServer() для создания сервера (разница между TCP-сервером и веб-сервером заключается в том, что

Еще один класс, который вы могли бы использовать org.h2.tools.Console (JavaDoc здесь) Просто запустите основной метод консоли, и я думаю, что это должно решить все.

Ответ 2

Вы должны иметь возможность использовать варианты в памяти или на основе файлов, а затем в своем приложении запускать сервер H2 TCP отдельно, например. используя Spring bean (помните полу-псевдокод и порт образца):

@Component
class Bootstrap {
    @PostConstruct
    public void startH2TcpServer() {
         Server.createTcpServer("-tcpPort", "9123", "-tcpDaemon").start();
    }
}

См. http://www.h2database.com/html/tutorial.html#using_server

Ответ 3

Как насчет изменения URL-адреса jdbc в конфигурации для включения

AUTO_SERVER=TRUE 

чтобы запустить h2 автоматически.

См. Автоматический смешанный режим

Несколько процессов могут обращаться к одной и той же базе данных без необходимости запустите сервер вручную. Для этого добавьте AUTO_SERVER = TRUE в URL-адрес базы данных. Вы можете использовать один и тот же URL-адрес базы данных независимо от того, база данных уже открыта или нет. Эта функция не работает с в памяти.

Использовать тот же URL-адрес для всех подключений к этой базе данных. Внутри, при использовании этого режима, первое соединение с базой данных выполняется во встроенном режиме и кроме того, сервер запускается внутри (как поток демона). Если база данных уже открыта в другом процессе, режим сервера - используется автоматически.