Перегляд вмісту бази даних у пам’яті 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>

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

Зверніть увагу: якщо ви використовуєте фреймворк Spring test, ви не побачите змін, внесених запущеною транзакцією, і ця транзакція буде відкочена відразу після тесту.


2
Я отримав помилку, що "true" є недійсним варіантом. Чи використовував параметр -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")
Йор

7
У чистому 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 ()
Одіссей

це також чудово в JUnit TestWatcher @Rule
weberjn

3
Це навіть працює, якщо ви налагоджуєте його за допомогою "evaluExpression" в intelliJ під час налагодження. (блокує решту вахт до зупинки)
borjab

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

9

У 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-адресу, щоб побачити БД


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 база даних.

По суті, це еквівалент нової версії a DatabaseManager(різновид non Swing), який запитує деталі підключення і встановлюється на --noexit)

Я також спробував версію Swing, але в ній був лише файл 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

Консоль H2


0

Я не знаю, чому він чудово працює на ваших машинах, але мені довелося витратити день, щоб він працював.

Сервер працює з Intellij Idea U за адресою url "jdbc: h2: tcp: // localhost: 9092 / ~ / default".

"localhost: 8082" у браузері працює нормально.

Я додав це до mvc-dispecher-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
  • Виграйте 10 версій драйверів PostBC ODBC: 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());

    }
}   

Конфігурація джерела даних Windows10 ODBC, яку може використовувати будь-який клієнт ODBC: У полі Databse має використовуватися ім'я, вказане в параметрі '-key'. Конфігурація ODBC

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.