H2数据库错误:数据库可能已在使用中:“被另一个进程锁定”

时间:2011-11-16 21:27:44

标签: java database 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程序中使用它?

13 个答案:

答案 0 :(得分:43)

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),并确保关闭可能已启动它的任何应用程序。你有一个主动锁。

答案 1 :(得分:12)

我在测试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

答案 2 :(得分:6)

您还可以访问&#34;首选项&#34;从H2控制台中选择标签,然后按关机按钮关闭所有活动会话。

答案 3 :(得分:5)

我遇到了同样的问题。 在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

<强>古德勒克

答案 4 :(得分:4)

我从Saman Salehi上面得到了线索。 我的用例: 准备REST应用程序以进行客户端负载平衡(运行REST的两个JVM实例)。在这里,我的MVC应用程序将调用此REST应用程序,该应用程序具有用于DATA的ActiveMQ后端。 当我在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 dasboard中运行并显示。

VM退出时不要关闭数据库:jdbc:h2 :; DB_CLOSE_ON_EXIT = FALSE

多个进程可以访问同一个数据库,而无需手动启动服务器; AUTO_SERVER = TRUE

进一步阅读: http://www.h2database.com/html/features.html

答案 5 :(得分:3)

简单步骤:转到任务管理器并终止java进程

然后开始你的应用

答案 6 :(得分:3)

您也可以删除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。在新的数据库初始化之后,一切都会好的。

答案 7 :(得分:1)

我遇到了从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>

答案 8 :(得分:1)

遇到类似问题,我的解决方案是在与其关联的锁定文件上运行fuser -k 'filename.db'

希望这有帮助!

答案 9 :(得分:1)

我在Eclipse中面临着这个问题。我所做的是,从任务管理器中杀死了正在运行的Java进程。

enter image description here

对我有用。

答案 10 :(得分:0)

此问题的答案=>线程“主”中的异常org.h2.jdbc.JdbcSQLException:数据库可能已在使用中:“已被另一个进程锁定”。可能的解决方案:关闭所有其他连接;使用服务器模式[90020-161]

从浏览器中关闭所有选项卡,在其中打开h2数据库也从您的PC退出h2引擎

答案 11 :(得分:0)

对于InteliJ:在数据库视图中右键单击数据库,然后选择“断开连接”。

答案 12 :(得分:0)

如果您正在同一应用程序中运行多个应用程序使用单个数据库(h2)的端口,请按如下所示在网址中添加AUTO_SERVER=TRUE

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