Просмотр содержимого базы данных H2 или HSQLDB в памяти
есть ли способ просмотреть содержимое базы данных H2 или HSQLDB в памяти для просмотра? Например, во время сеанса отладки с Hibernate, чтобы проверить, когда выполняется сброс; или чтобы убедиться, что сценарий, который создает экземпляр БД, дает ожидаемый результат.
существует ли аддон или библиотека, которую вы можете встроить в свой код, чтобы разрешить это?
пожалуйста, укажите, о каком из них вы говорите (H2 или HSQLDB), если у вас есть ответить конкретно на один из них.
9 ответов:
вы можете запустить 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 в режиме памяти не могут быть доступны с помощью консоли.вы также можете использовать 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 test framework, вы не увидите изменений, внесенных запущенной транзакцией, и эта транзакция будет откатана сразу после теста.
для H2, вы можете запустите веб-сервер в своем коде во время сеанса отладки, если у вас есть объект подключения к базе данных. Вы можете добавить эту строку в свой код или как "выражение часов" (динамически):
org.h2.tools.Server.startWebServer(conn);
серверный инструмент запустит локальный веб-браузер, который позволит вам получить доступ к базе данных.
в 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, чтобы увидеть DB
С 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 и веб-серверов:
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 если у вас есть источник данных bean с id=источник данных. Если это не работает, попробуйте столбцам по умолчанию.
У меня проблема с удаленным подключением H2 версии 1.4.190 к inMemory (а также в файле) с
Connection is broken: "unexpected status 16843008"
пока не понизить до 1.3.176. Смотрите Grails доступ к серверу H2 TCP зависает
Я не знаю, почему он отлично работает на ваших машинах, но мне пришлось потратить день, чтобы заставить его работать.
сервер работает с Intellij Idea U через url "jdbc:h2: tcp://localhost: 9092/~/default".
"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>