Xem nội dung của cơ sở dữ liệu trong bộ nhớ H2 hoặc HSQLDB


90

Có cách nào để duyệt nội dung của H2 hoặc cơ sở dữ liệu trong bộ nhớ HSQLDB để xem không? Ví dụ, trong một phiên gỡ lỗi với Hibernate để kiểm tra thời điểm thực hiện xả; hoặc để đảm bảo tập lệnh khởi tạo DB cho kết quả mong đợi.

Nó có tồn tại một addon hoặc một thư viện mà bạn có thể nhúng vào mã của mình để cho phép điều này không?

Vui lòng đề cập đến vấn đề bạn đang nói đến (H2 hoặc HSQLDB) trong trường hợp bạn có câu trả lời cụ thể cho một trong số chúng.

Câu trả lời:


59

Bạn có thể chạy máy chủ web H2 trong ứng dụng của mình để truy cập cùng một cơ sở dữ liệu trong bộ nhớ. Bạn cũng có thể truy cập H2 đang chạy ở chế độ máy chủ bằng cách sử dụng bất kỳ ứng dụng JDBC chung nào như SquirrelSQL .

CẬP NHẬT:

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

Giờ đây, bạn có thể kết nối với cơ sở dữ liệu của mình qua jdbc:h2:mem:foo_dbURL trong cùng một quy trình hoặc duyệt foo_dbcơ sở dữ liệu bằng cách sử dụng localhost:8082. Hãy nhớ đóng cả hai máy chủ. Xem thêm: Cơ sở dữ liệu H2 ở chế độ bộ nhớ không thể truy cập bằng Console .

Bạn cũng có thể sử dụng 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 bạn chỉ nên phụ thuộc vào các xác nhận chứ không phụ thuộc vào việc xem trộm nội dung cơ sở dữ liệu theo cách thủ công. Chỉ sử dụng điều này để khắc phục sự cố.

NB nếu bạn sử dụng khung kiểm tra Spring, bạn sẽ không thấy các thay đổi được thực hiện bởi một giao dịch đang chạy và giao dịch này sẽ được khôi phục ngay sau khi kiểm tra.


2
Tôi gặp lỗi rằng "true" là tùy chọn không hợp lệ. -WebAllowOthers có sử dụng để tham số không? Với mã H2 mới nhất, nó không có bất kỳ tham số nào. Xem phương thức "chính" tại đây: h2database.com/javadoc/org/h2/tools/Server.html
hshib

1
Giống như hman đề cập, phiên bản mới nhất không chấp nhận "true" tham số vì vậy chỉ cần loại bỏ nó:<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
Mike R

2
Các phiên bản mới tuân theo quy ước đối số riêng biệt của Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers") Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")
Jor

7
Trong tinh khiết Java, bạn phải gỡ bỏ các tham số "true", và tách các thông số như thế này:Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
xnopre

2
Với Spring Boot, bạn chỉ cần đặt "h2.console.enabled: true" và "h2.console.path: h2-console" trong tệp application.properties của mình.
user2754985

31

Đối với H2, bạn có thể khởi động một máy chủ web trong mã của mình trong phiên gỡ lỗi nếu bạn có đối tượng kết nối cơ sở dữ liệu. Bạn có thể thêm dòng này vào mã của mình hoặc dưới dạng 'biểu thức xem' (động):

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

Công cụ máy chủ sẽ khởi động một trình duyệt web cục bộ cho phép bạn truy cập cơ sở dữ liệu.


4
Nhận xét cho những ai đang sử dụng Spring Data - bạn có thể nhận kết nối từ ApplicationContext theo cách này: ((DataSource) context.getBean ("dataSource")). GetConnection ()
Odysseus

điều này cũng tuyệt vời trong JUnit TestWatcher @Rule
weberjn 28/02/17

3
Nó thậm chí còn hoạt động nếu bạn lau nó bằng "evalExpression" trong intelliJ trong khi gỡ lỗi. (khóa phần còn lại của đồng hồ cho đến khi dừng lại)
borjab

9

Trong H2, những gì phù hợp với tôi là:

Tôi viết mã, khởi động máy chủ như sau:

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

Điều đó khởi động máy chủ trên localhostcổng 9092.

Sau đó, trong mã, hãy thiết lập kết nối DB trên URL JDBC sau:

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

Trong khi gỡ lỗi, với tư cách là một khách hàng để kiểm tra DB, tôi sử dụng cái được cung cấp bởi H2, đủ tốt, để khởi chạy nó, bạn chỉ cần khởi chạy riêng java main sau

org.h2.tools.Console

Thao tác này sẽ khởi động máy chủ web có ứng dụng trên 8082, khởi chạy trình duyệt trên localhost:8082

Và sau đó, bạn có thể nhập URL trước đó để xem DB


4

Với HSQLDB, bạn có một số tùy chọn tích hợp.

Có hai trình quản lý cơ sở dữ liệu GUI và giao diện dòng lệnh cho cơ sở dữ liệu. Các lớp cho những điều này là:

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

Bạn có thể bắt đầu một trong các bước trên từ ứng dụng của mình và truy cập cơ sở dữ liệu trong bộ nhớ.

Một ví dụ với JBoss được đưa ra ở đây:

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

Bạn cũng có thể khởi động một máy chủ với ứng dụng của mình, trỏ nó vào cơ sở dữ liệu trong bộ nhớ.

org.hsqldb.Server

3

Bạn có thể hiển thị nó như một tính năng JMX, có thể khởi động thông qua 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);
    }
}

Ngữ cảnh XML:

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

3

Đây là bộ điều khiển Play 2 để khởi tạo máy chủ H2 TCP và 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 <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");
        }
    }
}

2

Đối với HSQLDB, Điều sau đây phù hợp với tôi:

DatabaseManager.threadedDBM();

Và điều này đã đưa ra GUI với các bảng và dữ liệu của tôi.

Tôi cũng đã thử phiên bản Swing, nhưng nó chỉ có một mainvà tôi không chắc chắn về các đối số để vượt qua. Nếu ai biết, xin vui lòng đăng ở đây.

Chỉ vì tôi đã tìm kiếm hàng giờ cho đúng tên cơ sở dữ liệu: Tên cơ sở dữ liệu là tên nguồn dữ liệu của bạn. Vì vậy, hãy thử với URL jdbc: hsqldb: mem: dataSource nếu bạn có bean nguồn dữ liệu với id = dataSource. Nếu điều này không hoạt động, hãy thử testdb là mặc định.


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


1

Đây là một nhận xét cho bài đăng trước của Thomas Mueller hơn là một câu trả lời, nhưng không đủ danh tiếng cho nó. Một cách khác để nhận kết nối nếu bạn là Mẫu Spring JDBC là sử dụng như sau:

jdbcTemplate.getDataSource().getConnection();

Vì vậy, trên chế độ gỡ lỗi nếu bạn thêm vào dạng xem "Biểu thức" trong Eclipse, nó sẽ mở trình duyệt hiển thị cho bạn Bảng điều khiển H2:

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

Chế độ xem biểu thức Eclipse

Bảng điều khiển H2


0

Tôi không biết tại sao nó hoạt động tốt trên máy của bạn, nhưng tôi đã phải dành một ngày để làm cho nó hoạt động.

Máy chủ hoạt động với Intellij Idea U thông qua url "jdbc: h2: tcp: // localhost: 9092 / ~ / default".

"localhost: 8082" trong trình duyệt vẫn hoạt động tốt.

Tôi đã thêm cái này vào 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

Còn về việc thoải mái xem (và cả chỉnh sửa) nội dung qua ODBC & MS-Access, Excel thì sao? Chuyển đổi phần mềm ::

  • Phiên bản H2: 1.4.196
  • Win 10 Postgres ODBC Driver Phiên bản: psqlodbc_09_03_0210
  • Đối với Máy khách Win7 ODBC: win7_psqlodbc_09_00_0101-x64.msi

Máy chủ 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());

    }
}   

Cấu hình nguồn dữ liệu ODBC của Windows10 có thể được sử dụng bởi bất kỳ máy khách ODBC nào: Trong trường Databse, tên được cung cấp trong tham số '-key' phải được sử dụng. Cấu hình ODBC

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.