ดูเนื้อหาของฐานข้อมูลในหน่วยความจำ H2 หรือ HSQLDB


90

มีวิธีเรียกดูเนื้อหาของฐานข้อมูลในหน่วยความจำ H2 หรือ HSQLDB เพื่อดูหรือไม่? ตัวอย่างเช่นในระหว่างเซสชันการดีบักด้วย Hibernate เพื่อตรวจสอบว่ามีการดำเนินการล้างเมื่อใด หรือเพื่อให้แน่ใจว่าสคริปต์ที่สร้างอินสแตนซ์ DB ให้ผลลัพธ์ที่คาดหวัง

มีส่วนเสริมหรือไลบรารีที่คุณสามารถฝังกับโค้ดของคุณเพื่ออนุญาตสิ่งนี้หรือไม่

โปรดระบุว่าคุณกำลังพูดถึงเรื่องใด (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>

BTW คุณควรขึ้นอยู่กับการยืนยันเท่านั้นไม่ใช่ในการดูเนื้อหาฐานข้อมูลด้วยตนเอง ใช้สิ่งนี้สำหรับการแก้ไขปัญหาเท่านั้น

หมายเหตุหากคุณใช้กรอบการทดสอบ Spring คุณจะไม่เห็นการเปลี่ยนแปลงที่เกิดขึ้นจากธุรกรรมที่กำลังดำเนินอยู่และธุรกรรมนี้จะถูกย้อนกลับทันทีหลังจากการทดสอบ


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")
จส

8
ใน 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 ()
Odysseus

นี่ก็ยอดเยี่ยมเช่นกันใน JUnit TestWatcher @Rule
weberjn

3
แม้จะใช้งานได้ถ้าคุณใช้ "evalExpression" ใน intelliJ ในขณะที่ดีบัก (ล็อคนาฬิกาที่เหลือจนกว่าจะหยุด)
บอร์จาบ

ฉันอัตโนมัติแบบมีสายเช่นเข้าไปในกรณีทดสอบของฉันและเพิ่มวิธีการกับร่างกายDataSource org.h2.tools.Server.startWebServer(dataSource.getConnection());ตอนนี้การประเมินวิธีนั้นจะเปิดเบราว์เซอร์ โปรดทราบว่าสิ่งนี้ทำให้การดำเนินการเข้าสู่โหมดสลีปจนกว่าคุณจะยกเลิกการเชื่อมต่อ (ไอคอนบนซ้ายในเบราว์เซอร์)!
ทอม

9

ใน H2 สิ่งที่เหมาะกับฉันคือ:

ฉันรหัสเริ่มต้นเซิร์ฟเวอร์เช่น:

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

เริ่มต้นเซิร์ฟเวอร์บนlocalhostพอร์ต 9092

จากนั้นสร้างการเชื่อมต่อ DB บน ​​JDBC URL ต่อไปนี้ในโค้ด:

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

ในขณะที่ดีบักในฐานะไคลเอนต์ในการตรวจสอบ DB ฉันใช้อันที่ H2 จัดเตรียมไว้ให้ซึ่งดีพอที่จะเปิดใช้งานคุณเพียงแค่เปิด java main ต่อไปนี้แยกกัน

org.h2.tools.Console

สิ่งนี้จะเริ่มต้นเว็บเซิร์ฟเวอร์ด้วยแอปบน 8082 เปิดเบราว์เซอร์บน localhost:8082

จากนั้นคุณสามารถป้อน URL ก่อนหน้าเพื่อดูฐานข้อมูล


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

คุณสามารถแสดงเป็นคุณสมบัติ 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();

และสิ่งนี้ทำให้ GUI พร้อมกับตารางและข้อมูลของฉันเมื่อฉันชี้ไปที่ฐานข้อมูล in-mem ที่ถูกต้อง

โดยพื้นฐานแล้วจะเทียบเท่ากับการสร้าง a DatabaseManager(ความหลากหลายที่ไม่ใช่ Swing) ซึ่งจะแจ้งให้ทราบรายละเอียดการเชื่อมต่อและตั้งค่าเป็น--noexit)

ฉันลองใช้เวอร์ชัน Swing ด้วย แต่มีเพียง a mainและฉันไม่แน่ใจว่าจะผ่านข้อโต้แย้งใด ถ้าใครรู้ช่วยโพสที่นี่

เพียงเพราะฉันค้นหาชื่อฐานข้อมูลที่ถูกต้องเป็นเวลาหลายชั่วโมง: ชื่อของฐานข้อมูลคือชื่อของแหล่งข้อมูลของคุณ ดังนั้นลองใช้ URL jdbc: hsqldb: mem: dataSource หากคุณมีแหล่งข้อมูล bean ที่มี id = dataSource หากไม่ได้ผลให้ลอง testdb ซึ่งเป็นค่าเริ่มต้น


3
org.hsqldb.util.DatabaseManagerSwing.main (สตริงใหม่ [] {"--url", URL, "--user", USERNAME, "--password", PASSWORD});
Petro Semeniuk

นี่คือคำอธิบายบางส่วนของพารามิเตอร์: stackoverflow.com/a/3076005/32453
rogerdpack

1

ฉันมีปัญหากับการเชื่อมต่อระยะไกล H2 เวอร์ชัน 1.4.190 กับ inMemory (เช่นเดียวกับในไฟล์) โดย Connection is broken: "unexpected status 16843008"จนกว่าจะไม่ดาวน์เกรดเป็น 1.3.176 ดูGrails ที่เข้าถึงเซิร์ฟเวอร์ H2 TCP แฮงค์


1

นี่เป็นความคิดเห็นมากกว่าโพสต์ของ Thomas Mueller ก่อนหน้านี้แทนที่จะเป็นคำตอบ แต่ยังไม่มีชื่อเสียงเพียงพอสำหรับเรื่องนี้ อีกวิธีหนึ่งในการเชื่อมต่อหากคุณเป็น Spring JDBC Template โดยใช้สิ่งต่อไปนี้:

jdbcTemplate.getDataSource().getConnection();

ดังนั้นในโหมดดีบักหากคุณเพิ่มในมุมมอง "นิพจน์" ใน Eclipse มันจะเปิดเบราว์เซอร์แสดงคอนโซล H2 ให้คุณ:

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

มุมมอง Eclipse Expressions

H2 คอนโซล


0

ฉันไม่รู้ว่าทำไมเครื่องของคุณถึงใช้งานได้ดี แต่ฉันต้องใช้เวลาหนึ่งวันเพื่อให้มันใช้งานได้

เซิร์ฟเวอร์ทำงานร่วมกับ Intellij Idea U ผ่าน url "jdbc: h2: tcp: // localhost: 9092 / ~ / default"

"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.2
  • รับรางวัล 10 Postgres ODBC Driver Version: 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());

    }
}   

Windows10 ODBC Datasource Configuration ซึ่งไคลเอ็นต์ ODBC ใด ๆ สามารถใช้ได้: ในฟิลด์ Databse จะต้องใช้ชื่อที่กำหนดในพารามิเตอร์ '-key' การกำหนดค่า ODBC

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.