簡體   English   中英

H2 數據庫錯誤:數據庫可能已在使用中:“已被另一個進程鎖定”

[英]H2 database error: Database may be already in use: "Locked by another process"

我正在嘗試從 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;"/>

要么

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

這也意味着您需要以 TCP 模式啟動服務器。 老實說,它在文檔中非常簡單。

強制終止進程(Windows 的 javaw.exe),並確保可能已啟動它的任何應用程序都已關閉。 您有一個活動鎖。

我有同樣的問題。 在 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

祝你好運

我將 h2db 與測試 T24 tafj 應用程序一起使用,我遇到了同樣的問題,但我設法通過識別運行 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

我從上面的薩曼薩利希那里得到了線索。 我的用例:為客戶端負載平衡准備 REST 應用程序(運行 REST 的兩個 JVM 實例)。 在這里,我的 MVC 應用程序將調用這個具有 ActiveMQ 后端的 REST 應用程序。 當我在 eclipse 中運行兩個 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 儀表板上運行並顯示。

VM退出時不要關閉數據庫:jdbc:h2:;DB_CLOSE_ON_EXIT=FALSE

多個進程可以訪問同一個數據庫,無需手動啟動服務器;AUTO_SERVER=TRUE

進一步閱讀: http : //www.h2database.com/html/features.html

您還可以從 H2 控制台訪問“首選項”選項卡,然后按關閉按鈕關閉所有活動會話。

簡單步驟:進入任務管理器並殺死java進程

然后開始你的申請

您也可以刪除 h2 文件數據庫的文件,問題就會消失。

jdbc:h2:~/dbname 表示將在用戶主目錄中創建名為 db name 的文件 h2 數據庫(~/ 表示用戶主目錄,希望你在 Linux 上工作)。

在我的本地機器中,它存在於:/home/jack/dbname.mv.db 我不知道為什么文件的名稱是 dbname.mv.db 而不是 dbname。 可能是它的 h2 默認設置。 我刪除這個文件:

rm ~/dbname.mv.db 

要么:

cd ~/ 
rm dbname.mv.db 

數據庫 dbname 將與所有數據一起刪除。 新數據庫初始化后一切都會好起來的。

我在從 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>

如果您在應用程序使用單個數據庫 (h2) 的多個端口中運行相同的應用程序,則在 url 中添加AUTO_SERVER=TRUE如下:

jdbc:h2:file:C:/simple-commerce/price;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE;AUTO_SERVER=TRUE

遇到類似的問題,我的解決方案是在具有關聯鎖的文件上運行fuser -k 'filename.db'

希望這可以幫助!

我在 eclipse 中遇到了這個問題。 我所做的是,從任務管理器中殺死了正在運行的 java 進程。

在此處輸入圖片說明

它對我有用。

在您的application.properties文件中 > 將數據源編輯為:

spring.datasource.url=jdbc:h2:file:C:/temp/test;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

快樂編碼!

這個問題的答案 => 線程“main”org.h2.jdbc.JdbcSQLException 中的異常:數據庫可能已在使用中:“被另一個進程鎖定”。 可能的解決方案:關閉所有其他連接; 使用服務器模式 [90020-161]

從瀏覽器中關閉所有選項卡,打開 h2 數據庫也從你的電腦退出 h2 引擎

對於 InteliJ:在數據庫視圖中右鍵單擊您的數據庫並選擇“斷開連接”。

識別 H2 進程 ID 並殺死它。 mac版

ps -ef|grep h2

然后獲取進程ID並殺死它。

殺死 -9 PID

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM