20

最近、私は新しいチームに参加しました。ここでは、スタブ サービスに h2 を使用しています。

Web インターフェイスを使用してこのデータベースの内容を表示できるかどうか疑問に思っていました。職場では、に行くことで利用できますlocalhost:5080

h2 データベースを使用するプロジェクトがありますが、ヒットしても h2 Web コンソールが表示されません。localhost:5080

私も試しlocalhost:8082ました-それも機能しません。

私のプロジェクト構成(正常に動作します):

     <bean id="wrappedDataSource" class="net.bull.javamelody.SpringDataSourceFactoryBean">
        <property name="targetName" value="dataSource" />
     </bean>

     <bean id="wrappedDataSource" class="net.bull.javamelody.SpringDataSourceFactoryBean">
            <property name="targetName" value="dataSource" />
        </bean>

        <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
            <property name="driverClassName" value="org.h2.Driver" />
            <property name="url" value="jdbc:h2:~/test;MODE=PostgreSQL" />
            <property name="username" value="sa" />
            <property name="password" value="" />
        </bean>

        <bean id="sessionFactory"
              class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="wrappedDataSource"/>
            <property name="configLocation">
                <value>classpath:hibernate-test.cfg.xml</value>
            </property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.show_sql">false</prop>
                    <prop key="hibernate.connection.charSet">UTF-8</prop>
                    <prop key="hibernate.format_sql">true</prop>
                    <prop key="hbm2ddl.auto">create-drop</prop>
                </props>
            </property>
        </bean>

        <context:property-placeholder location="classpath:jdbc.properties"/>

h2 Web コンソールにアクセスする方法がわかりません。助けてください。

PS

.m2フォルダーにのみ h2 の言及が表示されます

PS2

http://localhost:8082/構成の URL を次のように置き換えると、Web コンソールが利用できることに気付きました。

<property name="url" value="jdbc:h2:tcp://localhost/~/test;MODE=PostgreSQL" />

しかし、すでにh2を起動している場合は機能します(.m2フォルダーでh2jarファイルを見つけてダブルクリックします)

アプリケーションの起動時に h2 が起動されていない場合、次のエラーが表示されます。

java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:94)
    ...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dbInitializer': Invocation of init method failed; nested exception is org.hibernate.exception.GenericJDBCException: Could not open connection
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136)
    ...
Caused by: org.hibernate.exception.GenericJDBCException: Could not open connection
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
    ...
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Соединение разорвано: "java.net.ConnectException: Connection refused: connect: localhost"
Connection is broken: "java.net.ConnectException: Connection refused: connect: localhost" [90067-182])
    at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
    ...
Caused by: org.h2.jdbc.JdbcSQLException: Соединение разорвано: "java.net.ConnectException: Connection refused: connect: localhost"
Connection is broken: "java.net.ConnectException: Connection refused: connect: localhost" [90067-182]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    ...
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    ...

アプリケーションを起動したときにh2が開始されなかった場合、h2が開始されるようにしたいと考えています。

PS3

私は次のコードを書いてみました:

Server server = null;
try {
    server = Server.createTcpServer("-tcpAllowOthers").start();
    Class.forName("org.h2.Driver");
    Connection conn = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test;MODE=PostgreSQL", "sa", "");
 } catch (Exception e) {
    LOG.error("Error while initialize", e);
 }

私はそれを実行localhost:9092し、ブラウザに入力しようとした後です。

この時点でファイルをダウンロードします。ファイル内に次の内容:

Version mismatch, driver version is “0” but server version is “15”

私のh2バージョン1.4.182

PS4

このコードは機能します:

public class H2Starter extends ContextLoaderListener {
    private static final Logger LOG = LoggerFactory.getLogger(H2Starter.class);

    @Override
    public void contextInitialized(ServletContextEvent event) {

        startH2();
        super.contextInitialized(event);
    }

    private static void startH2() {

        try {
            Server.createTcpServer("-tcpAllowOthers").start();
            Class.forName("org.h2.Driver");
            DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test;MODE=PostgreSQL;AUTO_SERVER=TRUE", "sa", "");

            Server.createWebServer().start();
        } catch (Exception e) {
            LOG.error("cannot start H2 [{}]", e);
        }
    }

    public static void main(String[] args) {
        startH2();
    }
}

しかし、コンクリートスプリングプロファイルがアクティブな場合にのみ呼び出す必要があります(現在は常に機能します)

4

3 に答える 3

23

質問を 2 つの部分に分けましょう。

H2 への接続をどのように指定するかによって、さまざまな操作モードが得られます。

モードは次のとおりです。組み込み、インメモリ、サーバー。

jdbc:h2:~/test埋め込みモードで H2 インスタンスを提供します。組み込みモードには、同じクラスローダーと同じ JVM を介してのみアクセスできるという制限があります (証明)

jdbc:h2:mem:testインメモリ H2 インスタンスを取得します。それも外界からはアクセスできません。

jdbc:h2:tcp://localhost/testは H2 サーバーを起動し、JVMサーバー モードの外部からアクセスできますが、1 つの制限があります。接続を確立する前にサーバーを起動する必要があります。

最後の制限により、Connection refused: connect: localhost"例外が発生しています。

すべてを要約するには:

  • アプリケーションを起動するに H2 サーバーを起動します
  • jdbc:h2:tcp://localhost/test接続文字列として使用
  • ....
  • 幸せなコーディング:)

アップデート

アプリケーションを起動する過程でサーバーを起動したいことに気付きました。

アプリケーションの起動方法に応じて、いくつかの方法でこれを行うことができます。

  • maven / gradle を使用している場合は、アプリケーションが実際に起動する前に実行されるように、いくつかのプロファイル / タスクを追加する方が簡単です。
  • Javaですべてをセットアップする必要がある場合は、この質問を見ることをお勧めします

更新 2

ローカルデータベースへの接続が開発/デバッグの目的でのみ必要な場合は、maven プロファイルを使用してすべてをセットアップします。この質問からの回答はそれを解決します。

本番環境で H2 データベースにアクセスする必要がある場合 (そのユースケースはほとんど想像できません)、春にアクセスすることをお勧めします。主な理由は、(開発環境と比較して) 本番環境ではアプリケーション コンテナー/環境のセットアップが異なる可能性が高いためです。

Spring コンテキストの外部でサーバーを起動するかどうかに関する質問に対処するには、すべて要件に依存します。注意すべきことの 1 つは、データソースを開始する前にサーバーを開始する必要があることです(そうしないと、Spring コンテキストが読み込まれません)。

アップデート 3

残念ながら、実用的な解決策を提供することはできませんが、JavaDocs によると、TCP サーバーと Web サーバーには違いがあります。H2 Server クラスの JavaDoc をよく見てください。

メソッドを使用してサーバーを作成する必要があると思いServer.createWebServer()ます (TCP サーバーと Web サーバーの違いは、

使用できるもう 1 つの優れたクラスorg.h2.tools.Console( JavaDoc here ) Console の main メソッドを実行するだけで、すべてが解決するはずです。

于 2015-12-15T08:31:01.193 に答える
1

構成でjdbc urlを変更して含める方法はどうですか

AUTO_SERVER=TRUE 

h2を自動的に開始します。

自動混合モードを参照してください

サーバーを手動で起動しなくても、複数のプロセスが同じデータベースにアクセスできます。これを行うには、;AUTO_SERVER=TRUE をデータベース URL に追加します。データベースがすでに開いているかどうかに関係なく、同じデータベース URL を使用できます。この機能は、インメモリ データベースでは機能しません。

このデータベースへのすべての接続に同じ URL を使用します。内部的には、このモードを使用すると、データベースへの最初の接続が組み込みモードで行われ、さらにサーバーが内部的に (デーモン スレッドとして) 起動されます。データベースが別のプロセスですでに開かれている場合は、サーバー モードが自動的に使用されます。

于 2015-12-18T17:44:42.237 に答える