Просмотр содержимого базы данных H2 или HSQLDB в памяти - PullRequest
82 голосов
/ 05 сентября 2011

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

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

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

Ответы [ 10 ]

55 голосов
/ 05 сентября 2011

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

UPDATE:

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

Теперь вы можете подключиться к вашей базе данных через jdbc:h2:mem:foo_db URL в том же процессе или просмотреть базу данных 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>

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

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

29 голосов
/ 06 сентября 2011

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

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

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

8 голосов
/ 03 мая 2013

В H2, что работает для меня:

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

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

, который запускает сервер на localhost порт 9092.

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

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

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

org.h2.tools.Console

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

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

4 голосов
/ 05 сентября 2011

С 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
3 голосов
/ 19 мая 2015

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

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 голосов
/ 29 октября 2013

Вы можете представить его как функцию 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 />
1 голос
/ 15 ноября 2015

У меня проблема с удаленным подключением H2 версии 1.4.190 к inMemory (как и в файле) с Connection is broken: "unexpected status 16843008" до тех пор, пока не произойдет снижение до версии 1.3.176. См. Доступ к Grails H2 сервера TCP зависает

1 голос
/ 06 декабря 2012

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

DatabaseManager.threadedDBM();

И это вызвало графический интерфейс с моими таблицами и данными.

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

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

0 голосов
/ 23 февраля 2019

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

jdbcTemplate.getDataSource().getConnection();

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

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

Вид выражений Eclipse

Консоль H2

0 голосов
/ 09 марта 2018

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

Сервер работает с 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>
...