H2 또는 HSQLDB 인 메모리 데이터베이스의 내용보기


90

보기 위해 H2 또는 HSQLDB 인 메모리 데이터베이스의 콘텐츠를 탐색하는 방법이 있습니까? 예를 들어, 플러시가 언제 실행되는지 확인하기 위해 Hibernate로 디버깅 세션 동안; 또는 DB를 인스턴스화하는 스크립트가 예상 결과를 제공하는지 확인하십시오.

이를 허용하기 위해 코드와 함께 포함 할 수있는 애드온 또는 라이브러리가 있습니까?

그들 중 하나에 대한 답변이있는 경우에 대비하여 어떤 것 (H2 또는 HSQLDB)에 대해 이야기하고 있는지 언급하십시오.


이것이 귀하의 질문에 대답합니까? 디버깅하는 동안 메모리 hsqldb에서 검사
rogerdpack

답변:


59

동일한 인 메모리 데이터베이스에 액세스 할 애플리케이션 내에서 H2 웹 서버를 실행할 수 있습니다 . SquirrelSQL 과 같은 일반 JDBC 클라이언트를 사용하여 서버 모드에서 실행중인 H2에 액세스 할 수도 있습니다 .

최신 정보:

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>

BTW 데이터베이스 콘텐츠를 수동으로 들여다 보는 것이 아니라 단언에만 의존해야합니다. 문제 해결을 위해서만 사용하십시오.

NB Spring 테스트 프레임 워크를 사용하는 경우 실행중인 트랜잭션에 의해 변경된 사항을 볼 수 없으며이 트랜잭션은 테스트 직후 롤백됩니다.


2
"true"가 잘못된 옵션이라는 오류가 발생했습니다. -webAllowOthers가 매개 변수를 사용하는 데 사용 되었습니까? 최신 H2 코드에서는 매개 변수를 사용하지 않습니다. 여기에서 "main"메소드를보십시오 : 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")
Jor

7
순수 Java에서는 "true"매개 변수를 제거하고 다음과 같이 매개 변수를 분리해야합니다.Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
xnopre

2
Spring Boot를 사용하면 application.properties 파일에서 "h2.console.enabled : true"및 "h2.console.path : h2-console"을 간단히 설정할 수 있습니다.
user2754985

33

H2의 경우 데이터베이스 연결 개체가있는 경우 디버깅 세션 중에 코드 내에서 웹 서버를 시작할 수 있습니다 . 이 줄을 코드에 추가하거나 '감시 식'(동적으로)으로 추가 할 수 있습니다.

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

서버 도구는 데이터베이스에 액세스 할 수있는 웹 브라우저를 로컬로 시작합니다.


5
스프링 데이터를 사용하는 사람들을위한 코멘트-다음과 같이 ApplicationContext에서 연결을 얻을 수 있습니다 : ((DataSource) context.getBean ( "dataSource")). getConnection ()
Odysseus

이 또한 JUnit을 TestWatcher @Rule에서 중대하다
weberjn

3
디버깅하는 동안 intelliJ에서 "evaluateExpression"을 사용하여 실행해도 작동합니다. (멈출 때까지 나머지
시계를

DataSource인스턴스를 테스트 케이스에 자동 연결하고 body 메서드를 추가했습니다 org.h2.tools.Server.startWebServer(dataSource.getConnection());. 이제 그 방법을 평가하면 브라우저가 열립니다. 이로 인해 연결을 끊을 때까지 실행이 잠자기 상태가됩니다 (브라우저의 왼쪽 상단 아이콘)!
Tom

9

H2에서 저에게 효과적인 것은 다음과 같습니다.

나는 다음과 같이 서버를 시작하여 코딩합니다.

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

그러면 localhost포트 9092 에서 서버가 시작됩니다 .

그런 다음 코드에서 다음 JDBC URL에 DB 연결을 설정합니다.

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

디버깅하는 동안 DB를 검사하기 위해 클라이언트로 H2에서 제공하는 것을 사용합니다. 이것은 실행하기에 충분합니다. 다음 자바 메인을 별도로 실행하면됩니다.

org.h2.tools.Console

그러면 8082에서 앱으로 웹 서버가 시작되고 브라우저가 시작됩니다. localhost:8082

그런 다음 이전 URL을 입력하여 DB를 볼 수 있습니다.


4

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

문서에 따르면 모든 JDBC 연결에서 "관리자"를 사용할 수 있으므로 H2에서도 작동합니다. :) hsqldb.org/doc/2.0/util-guide/dbm-chapt.html
rogerdpack

3

JConsole을 통해 시작할 수있는 JMX 기능으로 노출 할 수 있습니다.

@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

이것은 H2 TCP 및 웹 서버를 초기화하는 Play 2 컨트롤러입니다.

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

그리고 이것은 내 테이블과 데이터가있는 GUI를 불러 일으켰습니다.

그것은 기본적으로 newing up과 동일합니다. DatabaseManager (비 스윙 다양한), 연결 정보에 대한 메시지를 표시하고로 설정 --noexit)

스윙 버전도 시도했지만 main 통과해야 할 인수가 확실하지 않았습니다. 아는 사람이 있으면 여기에 게시하십시오.

올바른 데이터베이스 이름을 몇 시간 동안 검색했기 때문에 : 데이터베이스 이름은 데이터 소스의 이름입니다. 따라서 id = dataSource 인 데이터 소스 Bean이있는 경우 URL jdbc : hsqldb : mem : dataSource로 시도하십시오. 이것이 작동하지 않으면 기본값 인 testdb를 시도하십시오.


3
org.hsqldb.util.DatabaseManagerSwing.main (new String [] { "--url", URL, "--user", USERNAME, "--password", PASSWORD});
Petro Semeniuk 2013

다음은 매개 변수에 대한 몇 가지 설명입니다. stackoverflow.com/a/3076005/32453
rogerdpack


1

이것은 답변 이라기보다는 이전 Thomas Mueller의 게시물에 대한 코멘트에 가깝지만 충분한 평판을 얻지 못했습니다. Spring JDBC Template 인 경우 연결을 얻는 또 다른 방법은 다음을 사용하는 것입니다.

jdbcTemplate.getDataSource().getConnection();

따라서 디버그 모드에서 Eclipse의 "Expressions"보기에 추가하면 H2 콘솔을 보여주는 브라우저가 열립니다.

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

Eclipse 표현식보기

H2 콘솔


0

나는 그것이 당신의 기계에서 잘 작동하는 이유를 모르겠지만 작동하기 위해 하루를 보냈습니다.

서버는 "jdbc : h2 : tcp : // localhost : 9092 / ~ / default"URL을 통해 Intellij Idea U와 함께 작동합니다.

브라우저의 "localhost : 8082"는 정상적으로 작동합니다.

나는 이것을 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>

0

ODBC 및 MS-Access, Excel을 통해 콘텐츠를 편안하게보고 편집하는 것은 어떻습니까? 소프트웨어 버전 ::

  • H2 버전 : 1.4.196
  • Win 10 Postgres ODBC 드라이버 버전 : psqlodbc_09_03_0210
  • Win7 ODBC 클라이언트 : 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());

    }
}   

모든 ODBC 클라이언트에서 사용할 수있는 Windows10 ODBC 데이터 소스 구성 : Databse 필드에서 '-key'매개 변수에 지정된 이름을 사용해야합니다. ODBC 구성

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.