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


90

Есть ли способ просмотреть содержимое базы данных H2 или HSQLDB в памяти для просмотра? Например, во время сеанса отладки с Hibernate, чтобы проверить, когда выполняется сброс; или убедиться, что сценарий, создающий экземпляр БД, дает ожидаемый результат.

Существует ли надстройка или библиотека, которые вы можете встроить в свой код, чтобы разрешить это?

Пожалуйста, укажите, о каком из них вы говорите (H2 или HSQLDB), если у вас есть ответ по одному из них.


Отвечает ли это на ваш вопрос? Проверять hsqldb в памяти во время отладки
rogerdpack

Ответы:


59

Вы можете запустить веб-сервер H2 в своем приложении, которое будет обращаться к той же базе данных в памяти. Вы также можете получить доступ к H2, работающему в режиме сервера, с помощью любого универсального клиента JDBC, например SquirrelSQL .

ОБНОВИТЬ:

Server webServer = Server.createWebServer("-web,-webAllowOthers,true,-webPort,8082").start();
Server server = Server.createTcpServer("-tcp,-tcpAllowOthers,true,-tcpPort,9092").start();

Теперь вы можете подключиться к своей базе данных через jdbc:h2:mem:foo_dbURL-адрес в рамках того же процесса или просмотреть foo_dbбазу данных с помощью localhost:8082. Не забудьте закрыть оба сервера. Смотрите также: База данных H2 в режиме памяти недоступна для консоли .

Вы также можете использовать Spring:

<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,true,-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,true,-webPort,8082"/>
</bean>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" depends-on="h2Server">
    <property name="driverClass" value="org.h2.Driver"/>
    <property name="jdbcUrl" value="jdbc:h2:mem:foo_db"/>
</bean>

Кстати, вы должны полагаться только на утверждения, а не на ручной просмотр содержимого базы данных. Используйте это только для устранения неполадок.

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


2
Я получил ошибку, что "истина" - недопустимая опция. Используется ли -webAllowOthers для приема параметра? С последним кодом H2 он не принимает никаких параметров. Посмотрите на «основной» метод здесь: h2database.com/javadoc/org/h2/tools/Server.html
hshib

1
Как упоминалось в hman, последняя версия не принимает параметр "true", поэтому просто удалите его:<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
Mike R

2
Новые версии следуют соглашению об отдельных аргументах Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers") Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")
Jor

8
В чистой Java вам нужно удалить параметр «true» и разделить параметры следующим образом:Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
xnopre

2
С помощью Spring Boot вы можете просто установить «h2.console.enabled: true» и «h2.console.path: h2-console» в файле application.properties.
user2754985

33

Для H2 вы можете запустить веб-сервер в своем коде во время сеанса отладки, если у вас есть объект подключения к базе данных. Вы можете добавить эту строку в свой код или как «выражение для наблюдения» (динамически):

org.h2.tools.Server.startWebServer(conn);

Серверный инструмент запустит локальный веб-браузер, который позволит вам получить доступ к базе данных.


5
Комментарий для тех, кто использует Spring Data - вы можете получить соединение из ApplicationContext следующим образом: ((DataSource) context.getBean ("dataSource")). GetConnection ()
Odysseus

это тоже замечательно в JUnit TestWatcher @Rule
weberjn

3
Это даже работает, если вы запускаете его с помощью "AssessmentExpression" в intelliJ во время отладки. (блокирует остальные часы до остановки)
Borjab

Я автоматически подключил DataSourceэкземпляр к моему тесту и добавил метод с телом org.h2.tools.Server.startWebServer(dataSource.getConnection());. Теперь при оценке этого метода открывается браузер. Обратите внимание, что это приводит к засыпанию выполнения до тех пор, пока вы не отключитесь (значок в верхнем левом углу браузера)!
Том

9

В H2 у меня работает следующее:

Я кодирую, запуская сервер, например:

server = Server.createTcpServer().start();

Это запускает сервер на localhostпорту 9092.

Затем в коде установите соединение с БД по следующему URL-адресу JDBC:

jdbc:h2:tcp://localhost:9092/mem:test;DB_CLOSE_DELAY=-1;MODE=MySQL

Во время отладки в качестве клиента для проверки БД я использую тот, который предоставляется H2, что достаточно хорошо, для его запуска вам просто нужно отдельно запустить следующую java main

org.h2.tools.Console

Это запустит веб-сервер с приложением на 8082, запустит браузер на localhost:8082

И затем вы можете ввести предыдущий URL, чтобы увидеть БД


4

С HSQLDB у вас есть несколько встроенных опций.

Есть два менеджера баз данных с графическим интерфейсом пользователя и интерфейс командной строки для базы данных. Классы для них:

org.hsqldb.util.DatabaseManager
org.hsqldb.util.DatabaseManagerSwing
org.hsqldb.cmdline.SqlTool

Вы можете запустить одно из перечисленных выше из своего приложения и получить доступ к базам данных в памяти.

Пример с JBoss приведен здесь:

http://docs.jboss.org/jbpm/v3.2/userguide/html/ch07s03.html

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

org.hsqldb.Server

Согласно документации, вы можете использовать «менеджер» с любым соединением JDBC, так что это будет работать и для H2 :) hsqldb.org/doc/2.0/util-guide/dbm-chapt.html
rogerdpack

3

Вы можете представить его как функцию JMX, запускаемую через JConsole:

@ManagedResource
@Named
public class DbManager {

    @ManagedOperation(description = "Start HSQL DatabaseManagerSwing.")
    public void dbManager() {
        String[] args = {"--url", "jdbc:hsqldb:mem:embeddedDataSource", "--noexit"};
        DatabaseManagerSwing.main(args);
    }
}

XML-контекст:

<context:component-scan base-package="your.package.root" scoped-proxy="targetClass"/>
<context:annotation-config />
<context:mbean-server />
<context:mbean-export />

3

Это контроллер Play 2 для инициализации H2 TCP и веб-серверов:

package controllers;

import org.h2.tools.Server;
import play.mvc.Controller;
import play.mvc.Result;

import java.sql.SQLException;

/**
 * Play 2 controller to initialize H2 TCP Server and H2 Web Console Server.
 *
 * Once it's initialized, you can connect with a JDBC client with
 * the URL `jdbc:h2:tcp://127.0.1.1:9092/mem:DBNAME`,
 * or can be accessed with the web console at `http://localhost:8082`,
 * and the URL JDBC `jdbc:h2:mem:DBNAME`.
 *
 * @author Mariano Ruiz <mrsarm@gmail.com>
 */
public class H2ServerController extends Controller {

    private static Server h2Server = null;
    private static Server h2WebServer = null;

    public static synchronized Result debugH2() throws SQLException {
        if (h2Server == null) {
            h2Server = Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9092");
            h2Server.start();
            h2WebServer = Server.createWebServer("-web","-webAllowOthers","-webPort","8082");
            h2WebServer.start();
            return ok("H2 TCP/Web servers initialized");
        } else {
            return ok("H2 TCP/Web servers already initialized");
        }
    }
}

3

Для HSQLDB у меня сработало следующее:

DatabaseManager.threadedDBM();

И это вызвало графический интерфейс с моими таблицами и данными, как только я указал его справа с именем in-mem database.

По сути, это эквивалент новой DatabaseManagerверсии (не Swing), которая запрашивает подробности подключения и имеет значение --noexit)

Я также пробовал версию Swing, но у нее был только a main, и я не был уверен, какие аргументы нужно передать. Если кто знает, напишите здесь.

Просто потому, что я часами искал правильное имя базы данных: имя базы данных - это имя вашего источника данных. Поэтому попробуйте использовать URL-адрес jdbc: hsqldb: mem: dataSource, если у вас есть компонент источника данных с id = dataSource. Если это не сработает, попробуйте testdb по умолчанию.


3
org.hsqldb.util.DatabaseManagerSwing.main (новая строка [] {"--url", URL, "--user", USERNAME, "--password", PASSWORD});
Петр Семенюк

Вот некоторые пояснения к параметрам: stackoverflow.com/a/3076005/32453
rogerdpack


1

Это больше комментарий к предыдущему сообщению Томаса Мюллера, а не ответ, но для этого недостаточно репутации. Другой способ установить соединение, если вы используете Spring JDBC Template, использует следующее:

jdbcTemplate.getDataSource().getConnection();

Итак, в режиме отладки, если вы добавите в представление «Выражения» в Eclipse, он откроет браузер, показывающий вам консоль H2:

org.h2.tools.Server.startWebServer(jdbcTemplate.getDataSource().getConnection());

Представление Eclipse Expressions

Консоль H2


0

Я не знаю, почему он нормально работает на ваших машинах, но мне пришлось потратить день, чтобы заставить его работать.

Сервер работает с Intellij Idea U по URL-адресу «jdbc: h2: tcp: // localhost: 9092 / ~ / default».

"localhost: 8082" в браузере тоже работает нормально.

Я добавил это в mvc-dispatcher-servlet.xml

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" depends-on="h2Server">
    <property name="driverClassName" value="org.h2.Driver"/>
    <property name="url" value="jdbc:h2:tcp://localhost:9092/~/default"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
</bean>

<bean id="h2Server" class="org.h2.tools.Server" factory-method="createTcpServer" init-method="start" destroy-method="stop" depends-on="h2WebServer">
    <constructor-arg>
        <array>
            <value>-tcp</value>
            <value>-tcpAllowOthers</value>
            <value>-tcpPort</value>
            <value>9092</value>
        </array>
    </constructor-arg>
</bean>

<bean id="h2WebServer" class="org.h2.tools.Server" factory-method="createWebServer" init-method="start" destroy-method="stop">
    <constructor-arg>
        <array>
            <value>-web</value>
            <value>-webAllowOthers</value>
            <value>-webPort</value>
            <value>8082</value>
        </array>
    </constructor-arg>
</bean>

0

Как насчет удобного просмотра (а также редактирования) контента через ODBC и MS-Access, Excel? Версии программного обеспечения:

  • Версия H2: 1.4.196
  • Версия драйвера ODBC для Win 10 Postgres: psqlodbc_09_03_0210
  • Для клиента ODBC Win7: win7_psqlodbc_09_00_0101-x64.msi

H2 Сервер:

/*
For JDBC Clients to connect:
jdbc:h2:tcp://localhost:9092/trader;CIPHER=AES;IFEXISTS=TRUE;MVCC=true;LOCK_TIMEOUT=60000;CACHE_SIZE=131072;CACHE_TYPE=TQ
*/
public class DBStarter {
    public static final String BASEDIR = "/C:/Trader/db/";
    public static final String DB_URL = BASEDIR + "trader;CIPHER=AES;IFEXISTS=TRUE;MVCC=true;LOCK_TIMEOUT=10000;CACHE_SIZE=131072;CACHE_TYPE=TQ";

  static void startServer() throws SQLException {
        Server tcpServer = Server.createTcpServer(
                "-tcpPort", "9092",
                "-tcpAllowOthers",
                "-ifExists",
//                "-trace",
                "-baseDir", BASEDIR
        );
        tcpServer.start();
        System.out.println("H2 JDBC Server started:  " + tcpServer.getStatus());

        Server pgServer = Server.createPgServer(
                "-pgPort", "10022",
                "-pgAllowOthers",
                "-key", "traderdb", DB_URL
        );
        pgServer.start();
        System.out.println("H2 ODBC PGServer started: " + pgServer.getStatus());

    }
}   

Конфигурация источника данных ODBC для Windows10, которая может использоваться любым клиентом ODBC: в поле Databse должно использоваться имя, указанное в параметре «-key». Конфигурация ODBC

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.