JavaアプリケーションからH2データベースを使用しようとしています。
H2コンソールを使用してデータベースとそのテーブルを作成した後、Javaを使用して接続しようとしました
Connection con = DriverManager.getConnection("jdbc:h2:~/dbname", "username", "password");
ただし、次のエラーが表示されます。
スレッド "main" org.h2.jdbc.JdbcSQLExceptionの例外:データベースは既に使用されている可能性があります: "別のプロセスによってロックされています"。考えられる解決策:他のすべての接続を閉じます。サーバーモードを使用する[90020-161]
dbname.lock.db
ファイルを削除しようとしましたが、自動的に再作成されます。
Javaプログラムからデータベースをロック解除して使用するにはどうすればよいですか?
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)を強制終了し、プロセスを開始した可能性のあるアプリケーションがシャットダウンされていることを確認します。アクティブなロックがあります。
テスト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
H2コンソールから[設定]タブにアクセスし、シャットダウンボタンを押してすべてのアクティブなセッションをシャットダウンすることもできます。
同じ問題がありました。 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
グッドラック
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は、すべてのデータとともに削除されます。新しいデータベースの初期化後はすべて問題ありません。
簡単な手順:タスクマネージャーに移動して、Javaプロセスを強制終了します
その後、アプリケーションを開始します
上記のサマンサレヒから手がかりを得ました。私のユースケース: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
私にとっての解決策は、fuser -k 'filename.db'
は、ロックが関連付けられているファイルに対して。
お役に立てれば!
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>