最近、私は新しいチームに参加しました。ここでは、スタブサービスに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の言及があります
構成内の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が起動するようにしたいのです。
私は次のコードを書き込もうとしました:
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
このコードは機能します:
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();
}
}
しかし、具体的なスプリングプロファイルがアクティブな場合にのみ呼び出す必要があります(現在は常に機能します)
質問を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"
_例外を引き起こしています。
すべてをまとめるには:
jdbc:h2:tcp://localhost/test
_を使用します更新
アプリケーションを起動するプロセスでサーバーを起動したいことに気づきました。
アプリケーションの起動方法に応じて、いくつかの方法でそれを行うことができます。
Update 2
ローカルデータベースへの接続が開発/デバッグの目的でのみ必要な場合、mavenプロファイルを使用してすべてをセットアップします。 この質問 からの回答で解決します。
本番環境でH2データベースにアクセスする必要がある場合(そのためのユースケースはほとんど想像できません)、春にそれを行うことをお勧めします。主に、アプリケーションコンテナ/環境のセットアップが本番環境とは異なる可能性が高いためです(開発環境と比較して)。
Springコンテキストの外部でサーバーを起動するかどうかに関する質問に対処するには、すべて要件に依存します。注意すべきことの1つは、サーバーを開始する必要があることです /データソースを開始する(そうでない場合、スプリングコンテキストは読み込まれません)
Update 3
残念ながら、実用的なソリューションを提供することはできませんが、JavaDocsによれば、TCPサーバーとWebサーバーの間には違いがあります。 JavaDocの詳細をご覧ください。 H2サーバークラス 。
Server.createWebServer()
メソッドを使用してサーバーを作成する必要があると思います(TCPサーバーとWebサーバーの違いは
_org.h2.tools.Console
_を使用できる別の優れたクラス( JavaDoc here )Consoleのメインメソッドを実行するだけで、すべてが解決するはずです。
構成内のjdbc urlを変更して含める
AUTO_SERVER=TRUE
h2を自動的に開始します。
自動混合モード を参照してください
サーバーを手動で起動することなく、複数のプロセスが同じデータベースにアクセスできます。これを行うには、データベースURLに; AUTO_SERVER = TRUEを追加します。データベースがすでに開いているかどうかに関係なく、同じデータベースURLを使用できます。この機能は、インメモリデータベースでは機能しません。
このデータベースへのすべての接続に同じURLを使用します。内部的には、このモードを使用すると、データベースへの最初の接続が埋め込みモードで行われ、さらにサーバーが内部で(デーモンスレッドとして)起動されます。データベースが別のプロセスですでに開いている場合、サーバーモードが自動的に使用されます。
メモリ内またはファイルベースのバリアントを使用できるようにする必要があります。次に、アプリケーションで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 を参照してください