Lihat konten database dalam memori H2 atau HSQLDB

90

Apakah ada cara untuk menelusuri konten database dalam memori H2 atau HSQLDB untuk dilihat? Misalnya, selama sesi debugging dengan Hibernate untuk memeriksa kapan flush dijalankan; atau untuk memastikan skrip yang membuat contoh DB memberikan hasil yang diharapkan.

Apakah ada addon atau pustaka yang dapat Anda sematkan dengan kode Anda untuk mengizinkannya?

Harap sebutkan mana yang Anda bicarakan (H2 atau HSQLDB) jika Anda memiliki jawaban khusus untuk salah satunya.

jplandrain.dll
sumber
Apakah ini menjawab pertanyaan Anda? Periksa dalam memori hsqldb saat debugging
rogerdpack

Jawaban:

59

Anda dapat menjalankan server web H2 dalam aplikasi Anda yang akan mengakses database dalam memori yang sama. Anda juga dapat mengakses H2 yang berjalan dalam mode server menggunakan klien JDBC generik seperti SquirrelSQL .

MEMPERBARUI:

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

Sekarang Anda dapat terhubung ke database Anda melalui jdbc:h2:mem:foo_dbURL dalam proses yang sama atau menelusuri foo_dbdatabase menggunakan localhost:8082. Ingatlah untuk menutup kedua server. Lihat juga: Database H2 dalam mode memori tidak dapat diakses oleh Konsol .

Anda juga bisa menggunakan 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>

BTW Anda hanya harus bergantung pada pernyataan dan bukan pada manual mengintip isi database. Gunakan ini hanya untuk pemecahan masalah.

NB jika Anda menggunakan kerangka pengujian Spring, Anda tidak akan melihat perubahan yang dibuat oleh transaksi yang sedang berjalan dan transaksi ini akan dibatalkan segera setelah pengujian.

Tomasz Nurkiewicz
sumber
2
Saya mendapat kesalahan bahwa "benar" adalah opsi yang tidak valid. Apakah -webAllowOthers digunakan untuk mengambil parameter? Dengan kode H2 terbaru, tidak ada parameter apa pun. Lihat metode "utama" di sini: h2database.com/javadoc/org/h2/tools/Server.html
hshib
1
Seperti yang disebutkan oleh hman, versi terbaru tidak menerima parameter "benar" jadi hapus saja:<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
Mike R
2
Versi baru mengikuti konvensi argumen terpisah Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers") Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")
Jor
7
Di Java murni, Anda harus menghapus parameter "true", dan memisahkan parameter seperti ini:Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
xnopre
2
Dengan Spring Boot Anda cukup menyetel "h2.console.enabled: true" dan "h2.console.path: h2-console" di file application.properties Anda.
pengguna2754985
33

Untuk H2, Anda dapat memulai server web dalam kode Anda selama sesi debugging jika Anda memiliki objek koneksi database. Anda dapat menambahkan baris ini ke kode Anda, atau sebagai 'ekspresi jam tangan' (secara dinamis):

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

Alat server akan memulai browser web secara lokal yang memungkinkan Anda mengakses database.

Thomas Mueller
sumber
5
Beri komentar untuk mereka yang menggunakan Spring Data - Anda bisa mendapatkan koneksi dari ApplicationContext dengan cara ini: ((DataSource) context.getBean ("dataSource")). GetConnection ()
Odysseus
ini juga bagus di JUit TestWatcher @Rule
weberjn
3
Ia bahkan bekerja jika Anda lauch dengan "evaluExpression" di intelliJ saat debugging. (mengunci sisa jam tangan sampai dihentikan)
borjab
Saya menghubungkan DataSourceinstans secara otomatis ke kasus pengujian saya dan menambahkan metode dengan body org.h2.tools.Server.startWebServer(dataSource.getConnection());. Sekarang mengevaluasi metode itu membuka browser. Perhatikan bahwa ini menyebabkan eksekusi tertidur sampai Anda memutuskan sambungan (ikon kiri atas di browser)!
Tom
9

Di H2, yang berhasil untuk saya adalah:

Saya membuat kode, memulai server seperti:

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

Itu memulai server pada localhostport 9092.

Kemudian, dalam kode, buat koneksi DB di URL JDBC berikut:

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

Saat men-debug, sebagai klien untuk memeriksa DB, saya menggunakan yang disediakan oleh H2, yang cukup baik, untuk meluncurkannya Anda hanya perlu meluncurkan java utama berikut secara terpisah

org.h2.tools.Console

Ini akan memulai server web dengan aplikasi di 8082, mengaktifkan browser localhost:8082

Dan kemudian Anda dapat memasukkan URL sebelumnya untuk melihat DB

dsantaolalla.dll
sumber
4

Dengan HSQLDB, Anda memiliki beberapa opsi bawaan.

Ada dua manajer basis data GUI dan antarmuka baris perintah ke basis data. Kelas untuk ini adalah:

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

Anda dapat memulai salah satu hal di atas dari aplikasi Anda dan mengakses database dalam memori.

Contoh dengan JBoss diberikan di sini:

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

Anda juga dapat memulai server dengan aplikasi Anda, mengarahkannya ke database dalam memori.

org.hsqldb.Server
fredt
sumber
Menurut dokumen, Anda dapat menggunakan "manajer" dengan koneksi JDBC apa pun, jadi ini juga akan berfungsi untuk H2 :) hsqldb.org/doc/2.0/util-guide/dbm-chapt.html
rogerdpack
3

Anda dapat mengeksposnya sebagai fitur JMX, yang dapat dimulai melalui 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);
    }
}

Konteks XML:

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

Ini adalah pengontrol Play 2 untuk menginisialisasi H2 TCP dan server Web:

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 <[email protected]>
 */
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");
        }
    }
}
Mariano Ruiz
sumber
3

Untuk HSQLDB, Yang berikut berhasil untuk saya:

DatabaseManager.threadedDBM();

Dan ini memunculkan GUI dengan tabel dan data saya setelah saya mengarahkannya ke database in-mem yang bernama kanan.

Ini pada dasarnya setara dengan newing up DatabaseManager(non Swing), yang meminta detail koneksi, dan diatur ke --noexit)

Saya juga mencoba versi Swing, tetapi hanya punya main, dan saya tidak yakin argumen yang harus dilewati. Jika ada yang tahu, silahkan posting disini.

Hanya karena saya mencari berjam-jam untuk nama database yang benar: Nama database adalah nama sumber data Anda. Jadi coba dengan URL jdbc: hsqldb: mem: dataSource jika Anda memiliki data source bean dengan id = dataSource. Jika ini tidak berhasil, coba testdb yang merupakan default.

knownasilya
sumber
3
org.hsqldb.util.DatabaseManagerSwing.main (String baru [] {"--url", URL, "--user", USERNAME, "--password", PASSWORD});
Petro Semeniuk
Berikut beberapa penjelasan tentang parameter: stackoverflow.com/a/3076005/32453
rogerdpack
1

Saya memiliki masalah dengan H2 versi 1.4.190 koneksi jarak jauh ke inMemory (dan juga dalam file) dengan Connection is broken: "unexpected status 16843008"sampai jangan downgrade ke 1.3.176. Lihat Grails mengakses server H2 TCP macet

Grigory Kislin
sumber
1

Ini lebih merupakan komentar untuk posting Thomas Mueller sebelumnya daripada sebuah jawaban, tetapi belum memiliki reputasi yang cukup untuk itu. Cara lain untuk mendapatkan koneksi jika Anda adalah Template Spring JDBC menggunakan yang berikut ini:

jdbcTemplate.getDataSource().getConnection();

Jadi pada mode debug jika Anda menambahkan ke tampilan "Ekspresi" di Eclipse, browser akan terbuka yang menampilkan Konsol H2:

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

Tampilan Ekspresi Eclipse

Konsol H2

Jacqueline Rodriguez
sumber
0

Saya tidak tahu mengapa ini berfungsi dengan baik di mesin Anda, tetapi saya harus menghabiskan satu hari untuk membuatnya berfungsi.

Server bekerja dengan Intellij Idea U melalui url "jdbc: h2: tcp: // localhost: 9092 / ~ / default".

"localhost: 8082" di browser juga berfungsi dengan baik.

Saya menambahkan ini ke dalam 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>
Eugene Kortov
sumber
0

Bagaimana dengan nyaman melihat (dan juga mengedit) konten melalui ODBC & MS-Access, Excel? Versi perangkat lunak ::

  • Versi H2: 1.4.196.0
  • Menangkan 10 Versi Driver ODBC Postgres: psqlodbc_09_03_0210
  • Untuk Win7 ODBC Client: win7_psqlodbc_09_00_0101-x64.msi

Server 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());

    }
}   

Konfigurasi Sumber Data ODBC Windows10 yang dapat digunakan oleh klien ODBC mana pun: Di bidang Data, nama yang diberikan dalam parameter '-key' harus digunakan. Konfigurasi ODBC

YDZOGODOQ
sumber