H2 veya HSQLDB bellek içi veritabanı içeriğini görüntüleyin


90

Görüntüleme için bir H2 veya HSQLDB bellek içi veritabanının içeriğine göz atmanın bir yolu var mı? Örneğin, hazırda bekletme ile bir hata ayıklama oturumu sırasında yıkamanın ne zaman yürütüldüğünü kontrol etmek için; veya DB'yi başlatan betiğin beklenen sonucu verdiğinden emin olmak için.

Buna izin vermek için kodunuzla birlikte yerleştirebileceğiniz bir eklenti veya kitaplık var mı?

Lütfen bunlardan birine özel bir cevabınız olması durumunda hangisinden bahsettiğinizi (H2 veya HSQLDB) belirtin.


Bu sorunuzu yanıtlıyor mu? Hata ayıklama sırasında bellek
hsqldb'de incele

Yanıtlar:


59

Aynı bellek içi veritabanına erişecek olan uygulamanızın içinde H2 web sunucusunu çalıştırabilirsiniz . Ayrıca, SquirrelSQL gibi herhangi bir jenerik JDBC istemcisini kullanarak sunucu modunda çalışan H2'ye erişebilirsiniz .

GÜNCELLEME:

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

Artık jdbc:h2:mem:foo_dbaynı işlem içinde URL aracılığıyla veritabanınıza bağlanabilir veya foo_dbkullanarak veritabanına göz atabilirsiniz localhost:8082. Her iki sunucuyu da kapatmayı unutmayın. Ayrıca bkz: Bellek modundaki H2 veritabanına Konsol ile erişilemez .

Ayrıca Spring'i de kullanabilirsiniz:

<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, veritabanı içeriğine manuel olarak göz atmaya değil, yalnızca iddialara güvenmelisiniz. Bunu yalnızca sorun giderme için kullanın.

Not Spring test çerçevesini kullanırsanız, çalışan bir işlem tarafından yapılan değişiklikleri görmezsiniz ve bu işlem testten hemen sonra geri alınır.


2
"Doğru" nun geçersiz seçenek olduğu şeklinde bir hata aldım. -WebAllowOthers eskiden parametre alır mıydı? En son H2 kodu ile herhangi bir parametre almaz. Burada "ana" yönteme bakın: h2database.com/javadoc/org/h2/tools/Server.html
hshib

1
Hman'ın bahsettiği gibi, en son sürüm "true" parametresini kabul etmemektedir, bu nedenle onu kaldırın:<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
Mike R

2
Yeni sürümler ayrı bir argüman kuralını takip ediyor Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers") Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")
Jor

8
Saf Java'da, "true" parametresini kaldırmanız ve aşağıdaki gibi parametreleri ayırmanız gerekir:Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
xnopre

2
Spring Boot ile application.properties dosyanızda "h2.console.enabled: true" ve "h2.console.path: h2-console" ayarlarını basitçe yapabilirsiniz.
user2754985

33

H2 için, bir veritabanı bağlantı nesneniz varsa, bir hata ayıklama oturumu sırasında kodunuz içinde bir web sunucusu başlatabilirsiniz . Bu satırı kodunuza veya bir 'izleme ifadesi' olarak (dinamik olarak) ekleyebilirsiniz:

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

Sunucu aracı, veritabanına erişmenizi sağlayan yerel olarak bir web tarayıcısı başlatacaktır.


5
Spring Data kullananlar için yorum - ApplicationContext'ten şu şekilde bağlantı alabilirsiniz: ((DataSource) context.getBean ("dataSource")). GetConnection ()
Odysseus

bu aynı zamanda bir JUnit TestWatcher @Rule için de harika
weberjn

3
Hatta hata ayıklama sırasında onu intelliJ'de "evalExpression" ile lauch etseniz bile çalışır. (durdurulana kadar saatlerin geri kalanını kilitler)
saatlerin borjab

Otomatik olarak kabloladım DataSource test body ile bir yöntem ekledim org.h2.tools.Server.startWebServer(dataSource.getConnection());. Şimdi bu yöntemi değerlendirmek tarayıcıyı açar. Bunun, siz bağlantıyı kesene kadar yürütmenin uyku moduna geçmesine neden olacağını unutmayın (tarayıcıda sol üst simge)!
Tom

9

H2'de benim için işe yarayan şey:

Sunucuyu şu şekilde başlatarak kodluyorum:

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

Bu, sunucuyu localhost9092 numaralı bağlantı noktasından başlatır .

Ardından, kodda, aşağıdaki JDBC URL'sinde bir DB bağlantısı oluşturun:

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

Hata ayıklama sırasında, DB'yi incelemek için bir istemci olarak, H2 tarafından sağlanan, yeterince iyi olanı kullanıyorum, onu başlatmak için sadece aşağıdaki java main'i ayrı olarak başlatmanız gerekir.

org.h2.tools.Console

Bu, 8082'de bir uygulama ile bir web sunucusu başlatacak, localhost:8082

Ardından, DB'yi görmek için önceki URL'yi girebilirsiniz.


4

HSQLDB ile birçok yerleşik seçeneğiniz vardır.

İki GUI veritabanı yöneticisi ve veritabanına bir komut satırı arayüzü vardır. Bunlar için sınıflar:

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

Yukarıdakilerden birini uygulamanızdan başlatabilir ve bellek içi veritabanlarına erişebilirsiniz.

JBoss ile bir örnek burada verilmiştir:

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

Ayrıca, uygulamanızla bir sunucu başlatarak onu bellek içi bir veritabanına yönlendirebilirsiniz.

org.hsqldb.Server

Dokümanlara göre, herhangi bir JDBC bağlantısıyla bir "yönetici" kullanabilirsiniz, bu nedenle bu H2 için de işe yarar
rogerdpack

3

JConsole ile başlatılabilen bir JMX özelliği olarak gösterebilirsiniz:

@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 bağlamı:

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

3

Bu, H2 TCP ve Web sunucularını başlatmak için bir Play 2 denetleyicisidir:

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 için aşağıdakiler benim için çalıştı:

DatabaseManager.threadedDBM();

Ve bu GUI'yi tablolarım ve verilerimle birlikte, onu sağ adlı in-mem veritabanına işaret ettiğimde ortaya çıkardı.

Temelde, DatabaseManagerbağlantı ayrıntılarını soran ve şu şekilde ayarlanan bir (Swing olmayan çeşit) yenileştirmeye eşdeğerdir.--noexit )

Swing versiyonunu da denedim, ama sadece bir tane vardı mainve geçecek argümanlardan emin değildim. Eğer bilen varsa, lütfen buraya gönderin.

Doğru veritabanı adını saatlerce aradığım için: Veritabanının adı, veri kaynağınızın adıdır. İd = dataSource ile bir veri kaynağı bean'iniz varsa jdbc: hsqldb: mem: dataSource URL'sini deneyin. Bu işe yaramazsa, varsayılan olan testdb'yi deneyin.


3
org.hsqldb.util.DatabaseManagerSwing.main (yeni String [] {"--url", URL, "--kullanıcı", KULLANICIADI, "--parola", ŞİFRE});
Petro Semeniuk

İşte parametrelerle ilgili bazı açıklamalar: stackoverflow.com/a/3076005/32453
rogerdpack


1

Bu, bir cevaptan ziyade önceki Thomas Mueller'in gönderisine yapılan bir yorumdur, ancak bunun için yeterince itibara sahip değil. Spring JDBC Template iseniz bağlantı kurmanın başka bir yolu da aşağıdakileri kullanmaktır:

jdbcTemplate.getDataSource().getConnection();

Bu nedenle, hata ayıklama modunda Eclipse'deki "İfadeler" görünümüne eklerseniz, size H2 Konsolunu gösteren tarayıcı açılır:

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

Eclipse İfadeleri Görünümü

H2 Konsolu


0

Sizin makinenizde neden iyi çalışıyor bilmiyorum, ama çalışmasını sağlamak için bir gün geçirmek zorunda kaldım.

Sunucu, "jdbc: h2: tcp: // localhost: 9092 / ~ / default" url'si aracılığıyla Intellij Idea U ile çalışır.

Tarayıcıdaki "localhost: 8082" da iyi çalışıyor.

Bunu mvc-dispatcher-servlet.xml dosyasına ekledim

<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

İçeriği ODBC ve MS-Access, Excel üzerinden rahatça görüntülemeye (ve ayrıca düzenlemeye) ne dersiniz? Softwareversions ::

  • H2 Sürümü: 1.4.196
  • 10 Postgres ODBC Sürücü Sürümünü Kazanın: psqlodbc_09_03_0210
  • Win7 ODBC İstemcisi için: win7_psqlodbc_09_00_0101-x64.msi

H2 Sunucusu:

/*
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());

    }
}   

Herhangi bir ODBC istemcisi tarafından kullanılabilen Windows10 ODBC Veri Kaynağı Yapılandırması: Veri tabanı alanında '-key' parametresinde verilen ad kullanılmalıdır. ODBC Yapılandırması

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.