web-dev-qa-db-ja.com

H2データベースエラー:データベースは既に使用されている可能性があります: "別のプロセスによってロックされています"

JavaアプリケーションからH2データベースを使用しようとしています。

H2コンソールを使用してデータベースとそのテーブルを作成した後、Javaを使用して接続しようとしました

Connection con = DriverManager.getConnection("jdbc:h2:~/dbname", "username", "password");

ただし、次のエラーが表示されます。

スレッド "main" org.h2.jdbc.JdbcSQLExceptionの例外:データベースは既に使用されている可能性があります: "別のプロセスによってロックされています"。考えられる解決策:他のすべての接続を閉じます。サーバーモードを使用する[90020-161]

dbname.lock.dbファイルを削除しようとしましたが、自動的に再作成されます。

Javaプログラムからデータベースをロック解除して使用するにはどうすればよいですか?

42
Vasilis

H2はまだ実行中です(保証できます)。 ->などの複数のユーザーに対してTCP接続を使用する必要があります

<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/C:\Database\Data\production;"/>

OR

DriverManager.getConnection("jdbc:h2:tcp://localhost/server~/dbname","username","password");

また、TCPモードでサーバーを起動する必要があります。正直なところ、ドキュメントではかなり簡単です。

プロセス(Windowsの場合はjavaw.exe)を強制終了し、プロセスを開始した可能性のあるアプリケーションがシャットダウンされていることを確認します。アクティブなロックがあります。

44

テストT24 tafjアプリケーションでh2dbを使用していますが、同じ問題を抱えていましたが、h2を実行しているアプリケーション(データベース接続をセットアップしようとしたときに起動)を特定することで解決できました。

ps aux|grep Java

出力は次のようになります。

sysadmin 22755  3.2  0.1 5189724 64008 pts/3   Sl   08:28   0:00 /usr/Java/default/bin/Java -server -Xmx2048M -XX:MaxPermSize=256M -cp h2-1.3.175.jar:/r14tafj/TAFJ/dbscripts/h2/TAFJFunctions.jar org.h2.tools.Server -tcp -tcpAllowOthers -baseDir /r14tafj/t24/data

プロセスIDでこれを強制終了します。

kill -9 22755

最後にロックファイルを削除します。

rm -f dbname.lock.db
13
Cal Vin

H2コンソールから[設定]タブにアクセスし、シャットダウンボタンを押してすべてのアクティブなセッションをシャットダウンすることもできます。

7
Filip

同じ問題がありました。 Intelljでは、プログラムを実行しているときにh2データベースを使用したいときに同じエラーが発生しました。この問題を解決するために、接続URLを

spring.datasource.url=jdbc:h2:file:~/ipinbarbot

に:

spring.datasource.url=jdbc:h2:~/ipinbarbot;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

そして、私の問題はなくなりました。これで、プログラムの実行中に「ipinbarbot」データベースに接続できます。 Hibernateを使用する場合は、次のことも忘れないでください。

spring.jpa.hibernate.ddl-auto = update

グッドラック

7
Saman Salehi

H2ファイルデータベースのファイルを削除することもでき、問題は解消されます。

jdbc:h2:〜/ dbnameは、db nameという名前のファイルh2データベースがユーザーのホームディレクトリに作成されることを意味します(〜/はユーザーのホームディレクトリを意味します。Linuxで作業することを望みます)。

ローカルマシンの/home/jack/dbname.mv.dbにあるのは、ファイルの名前がdbnameではなくdbname.mv.dbである理由がわかりません。 h2のデフォルト設定である場合があります。このファイルを削除します。

rm ~/dbname.mv.db 

または:

cd ~/ 
rm dbname.mv.db 

データベースdbnameは、すべてのデータとともに削除されます。新しいデータベースの初期化後はすべて問題ありません。

4
Jackkobec

簡単な手順:タスクマネージャーに移動して、Javaプロセスを強制終了します

その後、アプリケーションを開始します

4
Sivakrishna

上記のサマンサレヒから手がかりを得ました。私のユースケース:RESTクライアント側の負荷分散のためのアプリケーション(RESTの2つのJVMインスタンスの実行)。ここで、私のMVCアプリケーションはこれを呼び出すREST DATAのActiveMQバックエンド。Eclipseで2つのインスタンスRESTアプリケーションを実行し、次の構成で両方のインスタンスを同時に実行しようとすると問題が発生しました。

spring.datasource.url=jdbc:h2:file:./Database;
spring.jpa.properties.hibernate.hbm2ddl.auto=update

DB_CLOSE_ON_EXIT = FALSE; AUTO_SERVER = TRUEを追加した後

spring.datasource.url=jdbc:h2:file:./Database;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

両方のインスタンスが実行され、Eureka dasboardで表示されています。

VM exits:jdbc:h2:; DB_CLOSE_ON_EXIT = FALSEのときにデータベースを閉じないでください。

サーバーを手動で起動することなく、複数のプロセスが同じデータベースにアクセスできます; AUTO_SERVER = TRUE

さらに読む: http://www.h2database.com/html/features.html

4
vimal krishna

私にとっての解決策は、fuser -k 'filename.db'は、ロックが関連付けられているファイルに対して。

お役に立てれば!

1
DerfOh

WebアプリケーションからORMLiteを実行すると、同様の問題が発生しました。最初は、URLでサーバーモードを使用する構文に固執しました。上記の答えはそれを助けました。その後、私は同様のユーザー/パスワードエラーを見つけました。何もシャットダウンしたり、ファイルを消去したりする必要はありませんでした。次のコードが機能しました:

protected ConnectionSource getConnectionSource() throws SQLException {
    String databaseUrl = "jdbc:h2:tcp://localhost/~/test";
    return new JdbcConnectionSource(databaseUrl,"sa","sa");
}

WildflyのサーバーモードでH2を使用するには、standalone.xmlでconnection-urlを変更しました

<datasource jndi-name="Java:jboss/datasources/ExampleDS" pool- name="ExampleDS" enabled="true" use-Java-context="true">
     <connection-url>jdbc:h2:tcp://localhost/~/test</connection-url>
               …
</datasource>
1
user6627139