web-dev-qa-db-ja.com

ローカルh2データベース(Webコンソール)のコンテンツを表示する方法は?

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

Webインターフェイスを使用してこのデータベースのコンテンツを表示できるかどうか疑問に思っていました。職場ではlocalhost:5080にアクセスして利用できます

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

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コンソールにアクセスする方法についてのアイデアがありません。助けてください。

追伸.

.m2フォルダーにのみh2の言及があります

P.S.2

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

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

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

アプリケーションの起動時に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が起動するようにしたいのです。

P.S.3

私は次のコードを書き込もうとしました:

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

P.S.4

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

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

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

19
gstackoverflow

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

H2への接続の指定方法に応じて、さまざまな動作モードが得られます。

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

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

_jdbc:h2:mem:test_は、インメモリH2インスタンスを取得します。また、 not は外界からアクセスできます。

_jdbc:h2:tcp://localhost/test_はH2サーバーを起動し、JVMの外部から accessible になります サーバーモード ただし、1つの制限があります-サーバーは前に起動する必要があります接続が確立されます。

最後の制限は_Connection refused: connect: localhost"_例外を引き起こしています。

すべてをまとめるには:

  • アプリケーションを起動する前にH2サーバーを起動します
  • 接続文字列として_jdbc:h2:tcp://localhost/test_を使用します
  • ....
  • ハッピーコーディング:)

更新

アプリケーションを起動するプロセスでサーバーを起動したいことに気づきました。

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

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

Update 2

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

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

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

Update 3

残念ながら、実用的なソリューションを提供することはできませんが、JavaDocsによれば、TCPサーバーとWebサーバーの間には違いがあります。 JavaDocの詳細をご覧ください。 H2サーバークラス

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

_org.h2.tools.Console_を使用できる別の優れたクラス( JavaDoc here )Consoleのメインメソッドを実行するだけで、すべてが解決するはずです。

21
WeMakeSoftware

構成内のjdbc urlを変更して含める

AUTO_SERVER=TRUE 

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

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

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

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

1
display_name

メモリ内またはファイルベースのバリアントを使用できるようにする必要があります。次に、アプリケーションでH2 TCPサーバーを個別に起動します。たとえば、Spring Beanを使用します(セミ疑似コードとサンプルポート):

@Component
class Bootstrap {
    @PostConstruct
    public void startH2TcpServer() {
         Server.createTcpServer("-tcpPort", "9123", "-tcpDaemon").start();
    }
}

http://www.h2database.com/html/tutorial.html#using_server を参照してください

1
Jukka