Посмотреть содержимое базы данных H2 или HSQLDB в памяти
-
26-10-2019 - |
Вопрос
Есть ли способ просмотреть содержание базы данных H2 или HSQLDB в памяти для просмотра? Например, во время сеанса отладки с Hibernate, чтобы проверить, когда выполняется промывка; или убедиться, что сценарий, который экстремирует БД, дает ожидаемый результат.
Существует ли это аддон или библиотека, которую вы можете встроить в свой код, чтобы разрешить это?
Пожалуйста, упомяните, о каком вы говорите (H2 или HSQLDB), если у вас есть ответ, конкретный для одного из них.
Решение
Вы можете запустить 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_db
URL в том же процессе или просмотрите foo_db
база данных с использованием localhost:8082
. Анкет Не забудьте закрыть оба сервера. Смотрите также: База данных H2 в режиме памяти не может быть доступна Console.
Вы также можете использовать пружину:
<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 Если вы используете структуру тестирования пружины, вы не увидите изменения, внесенные в результате запущенной транзакции, и эта транзакция будет передана обратно сразу после тестирования.
Другие советы
Для H2 вы можете Запустите веб -сервер в вашем коде Во время сеанса отладки, если у вас есть объект подключения к базе данных. Вы можете добавить эту строку в свой код или как «выражение наблюдения» (динамически):
org.h2.tools.Server.startWebServer(conn);
Серверный инструмент запустит веб -браузер локально, который позволяет вам получить доступ к базе данных.
В H2, что работает для меня:
Я код, запускаю сервер как:
server = Server.createTcpServer().start();
Это запускает сервер на localhost
Порт 9092.
Затем, в коде, установите подключение DB на следующем 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, чтобы увидеть БД
С HSQLDB у вас есть несколько встроенных вариантов.
В базе данных есть два менеджера базы данных GUI и интерфейс командной строки. Классы для них:
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
Вы можете разоблачить его как функцию 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 />
Это контроллер Play 2 для инициализации H2 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");
}
}
}
Для HSQLDB для меня сработало следующее:
DatabaseManager.threadedDBM();
И это подняло графический интерфейс с моими таблицами и данными.
Я также попробовал версию Swing, но у нее только main
, и я не был уверен в аргументах, чтобы пройти. Если кто -то знает, пожалуйста, отправьте здесь.
Просто потому, что я несколько часов искал правильное имя базы данных: имя базы данных - это имя вашего данных. Так что попробуйте с url jdbc: hsqldb: mem: dataSource, если у вас есть фасоль источника данных с id = dataSource. Если это не работает, попробуйте TestDB, который является по умолчанию.
У меня проблема с H2 версией 1.4.190 удаленное подключение к Inmemory (а также в файле) с Connection is broken: "unexpected status 16843008"
Пока не понизитесь до 1.3.176. Видеть Грааль, доступ к серверу H2 TCP, висит
Я не знаю, почему это работает нормально на ваших машинах, но мне пришлось потратить день, чтобы получить его, работая.
Сервер работает с Intellij Idea U через URL "JDBC: H2: TCP: // localhost: 9092/~/по умолчанию".
«Localhost: 8082» в браузере Alse работает нормально.
Я добавил это в 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>
Это скорее комментарий к предыдущему сообщению Томаса Мюллера, а не ответом, но не имеет достаточно репутации для этого. Еще один способ получить соединение, если вы являетесь шаблоном Spring JDBC, использует следующее:
jdbcTemplate.getDataSource().getConnection();
Итак, в режиме отладки, если вы добавите в представление «выражения» в Eclipse, он откроет браузер, показывающий вам консоль H2:
org.h2.tools.Server.startWebServer(jdbcTemplate.getDataSource().getConnection());