H2 या HSQLDB इन-मेमोरी डेटाबेस की सामग्री देखें


90

क्या देखने के लिए H2 या HSQLDB इन-मेमोरी डेटाबेस की सामग्री को ब्राउज़ करने का एक तरीका है? उदाहरण के लिए, हाइबरनेट के साथ डिबगिंग सत्र के दौरान यह जांचने के लिए कि फ्लश निष्पादित कब होता है; या यह सुनिश्चित करने के लिए कि स्क्रिप्ट डीबी का संकेत देती है, अपेक्षित परिणाम देता है।

क्या इसमें एक ऐडऑन या एक पुस्तकालय है जिसे आप इसे अनुमति देने के लिए अपने कोड के साथ एम्बेड कर सकते हैं?

कृपया, उल्लेख करें कि आप इनमें से किसके बारे में बात कर रहे हैं (H2 या HSQLDB)।


क्या इससे आपके सवाल का जवाब मिलता है? डिबगिंग करते समय मेमोरी hsqldb में निरीक्षण करें
rogerdpack

जवाबों:


59

आप अपने एप्लिकेशन के भीतर H2 वेब सर्वर चला सकते हैं जो उसी-इन-मेमोरी डेटाबेस तक पहुंच जाएगा। आप किसी भी सामान्य JDBC क्लाइंट जैसे कि SquirrelSQL का उपयोग करके सर्वर मोड में चल रहे 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। दोनों सर्वरों को बंद करना याद रखें। यह भी देखें: स्मृति मोड में एच 2 डेटाबेस कंसोल द्वारा पहुँचा नहीं जा सकता

आप स्प्रिंग का उपयोग भी कर सकते हैं:

<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 यदि आप स्प्रिंग परीक्षण ढांचे का उपयोग करते हैं, तो आप एक चल रहे लेन-देन द्वारा किए गए परिवर्तनों को नहीं देखेंगे और यह लेनदेन परीक्षण के तुरंत बाद वापस कर दिया जाएगा।


2
मुझे त्रुटि मिली कि "सही" अमान्य विकल्प है। क्या -डीडब्लूऑलवेदर पैरामीटर लेते थे? नवीनतम H2 कोड के साथ, यह कोई पैरामीटर नहीं लेता है। यहां "मुख्य" विधि देखें: h2database.com/javadoc/org/h2/tools/Server.html
hshib

1
जैसा कि हमैन ने उल्लेख किया है, नवीनतम संस्करण "सच" पैरामीटर को स्वीकार नहीं करता है, इसलिए इसे हटा दें:<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
माइक आर

2
नए संस्करण अलग तर्क सम्मेलन का पालन करते हैं Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers") Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")
जोर

7
शुद्ध जावा में, आपको "सही" पैरामीटर को निकालना होगा, और इस तरह के मापदंडों को अलग करना होगा:Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
xnopre

2
स्प्रिंग बूट के साथ आप अपने एप्लिकेशन में केवल "h2.console.enabled: true" और "h2.console.path: h2-कंसोल" सेट कर सकते हैं।
user2754985

33

यदि आपके पास डेटाबेस कनेक्शन ऑब्जेक्ट है , तो H2 के लिए, आप डिबगिंग सत्र के दौरान अपने कोड के भीतर एक वेब सर्वर शुरू कर सकते हैं । आप इस लाइन को अपने कोड में, या 'वॉच एक्सप्रेशन' (गतिशील रूप से) के रूप में जोड़ सकते हैं:

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

सर्वर टूल स्थानीय रूप से एक वेब ब्राउज़र शुरू करेगा जो आपको डेटाबेस तक पहुंचने की अनुमति देता है।


5
स्प्रिंग डेटा का उपयोग करने वालों के लिए टिप्पणी - आप इस तरह से ApplicationContext से कनेक्शन प्राप्त कर सकते हैं: (((DataSource) reference.getBean ("dataSource")। getConnection ()
Odysseus

यह JUnit TestWatcher @Rule
weberjn

3
यह तब भी काम करता है जब आप डिबगिंग के दौरान इंटेलीजे में "मूल्यांकनएक्सप्रेशन" के साथ इसकी सराहना करते हैं। (बाकी
घड़ियों को

मैंने ऑटो निकाल दिया DataSource अपने परीक्षण मामले में उदाहरण को और शरीर के साथ एक विधि जोड़ी org.h2.tools.Server.startWebServer(dataSource.getConnection());। अब उस विधि का मूल्यांकन करने से ब्राउज़र खुल जाता है। ध्यान दें कि यह तब तक सोने का कारण बनता है जब तक आप डिस्कनेक्ट नहीं करते (ब्राउज़र में शीर्ष-बाएं आइकन)!
टॉम

9

H2 में, मेरे लिए क्या काम करता है:

मैं कोड, सर्वर शुरू करने की तरह:

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

यह localhostपोर्ट 9092 पर सर्वर शुरू करता है ।

फिर, कोड में, निम्नलिखित JDBC URL पर DB कनेक्शन स्थापित करें:

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

डिबगिंग करते समय, एक ग्राहक के रूप में डीबी का निरीक्षण करने के लिए मैं एच 2 द्वारा प्रदान किए गए एक का उपयोग करता हूं, जो काफी अच्छा है, इसे लॉन्च करने के लिए आपको बस निम्नलिखित जावा मुख्य को अलग से लॉन्च करने की आवश्यकता है

org.h2.tools.Console

यह 8082 पर एक ऐप के साथ एक वेब सर्वर शुरू करेगा, एक ब्राउज़र लॉन्च करेगा localhost:8082

और फिर आप DB देखने के लिए पिछले 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

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

यह 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 को मेरे टेबल्स और डेटा के साथ ला दिया, एक बार मैंने इसे इन-मेम डेटाबेस में दाईं ओर इंगित किया।

मैंने स्विंग संस्करण की भी कोशिश की, लेकिन इसमें केवल एक था main, और मैं पास होने के लिए तर्कों के बारे में अनिश्चित था। अगर किसी को पता है, तो कृपया यहां पोस्ट करें।

सिर्फ इसलिए कि मैंने सही डेटाबेस नाम के लिए घंटों खोज की: डेटाबेस का नाम आपके डेटासोर्स का नाम है। तो URL jdbc के साथ प्रयास करें: hsqldb: mem: dataSource यदि आपके पास id = dataSource के साथ डेटा स्रोत बीन है। यदि यह काम नहीं करता है, तो टेस्टडब की कोशिश करें जो डिफ़ॉल्ट है।


3
org.hsqldb.util.DatabaseManagerSwing.main (नया स्ट्रिंग [] {"--url", URL, "--user", USERNAME, "--password", PASSWORD});
पेट्रो सेमेनिएक

यहाँ मापदंडों की कुछ व्याख्या है: stackoverflow.com/a/3076005/32453
rogerdpack

1

मैं H2 संस्करण के साथ एक समस्या है। 1.4.190 रिमोट कनेक्शन inMemory (साथ ही फाइल में) Connection is broken: "unexpected status 16843008"जब तक 1.3.176 पर डाउनग्रेड नहीं होता है। देखें H2 टीसीपी सर्वर हैंगिंग तक पहुंच जाता है


1

यह उत्तर के बजाय पिछले थॉमस मुलर की पोस्ट के लिए एक टिप्पणी है, लेकिन इसके लिए पर्याप्त प्रतिष्ठा नहीं मिली है। यदि आप स्प्रिंग JDBC टेम्प्लेट हैं तो कनेक्शन प्राप्त करने का दूसरा तरीका निम्नलिखित है:

jdbcTemplate.getDataSource().getConnection();

इसलिए डिबग मोड पर यदि आप ग्रहण में "एक्सप्रेशंस" दृश्य को जोड़ते हैं तो यह ब्राउज़र को आपको एच 2 कॉन्सेप्ट दिखाएगा:

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

एक्लिप्स एक्सप्रेशंस देखें

एच 2 कंसोल


0

मुझे नहीं पता कि यह आपकी मशीनों पर ठीक काम क्यों कर रहा है, लेकिन इसे काम करने के लिए मुझे एक दिन बिताना होगा।

सर्वर Intellij Idea U के साथ url "jdbc: h2: tcp: // localhost: 9092 / ~ / default" के माध्यम से काम करता है।

ब्राउज़र में "लोकलहोस्ट: 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 पर सामग्री को आराम से देखने (और संपादन) के बारे में क्या? Softwareversions ::

  • एच 2 संस्करण: 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());

    }
}   

Windows10 ODBC डेटास्रोत कॉन्फ़िगरेशन जो किसी भी ODBC क्लाइंट द्वारा उपयोग किया जा सकता है: डेटाबेस फ़ील्ड में '-key' पैरामीटर में दिए गए नाम का उपयोग करना होगा। ODBC कॉन्फ़िगरेशन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.