Как показать содержимое локальной базы данных 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. пожалуйста помочь.

П. С.

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

П. С. 2

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

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

но он работает, если я уже запускаю h2 (в найти 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 запускается, если он не запускается при запуске приложения.

П. С. 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”

моя версия h2 1.4.182

П. С. 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();
    }
}

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

3 ответов


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

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

режимы: встроенный в памяти, сервер.

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

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, я предлагаю вам посмотреть на это вопрос

обновление 2

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

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

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

обновление 3

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

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

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


вы должны иметь возможность использовать варианты в памяти или на основе файлов, а затем в вашем приложении запустите сервер 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


Как насчет изменения url jdbc в конфигурации, чтобы включить

AUTO_SERVER=TRUE 

начать Н2 автоматически.

посмотреть автоматический смешанный режим

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

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