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

Vas*_*lis 43 java database h2

我正在尝试使用Java应用程序中的H2数据库.

我通过H2控制台创建了数据库及其表,然后尝试使用Java连接

Connection con = DriverManager.getConnection("jdbc:h2:~/dbname", "username", "password");
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

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

我试图删除该dbname.lock.db文件,但它会自动重新创建.

如何解锁数据库以从我的Java程序中使用它?

Dan*_*man 44

H2仍然在运行(我可以保证).您需要为多个用户使用TCP连接,例如 - >

<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/C:\Database\Data\production;"/>
Run Code Online (Sandbox Code Playgroud)

要么

DriverManager.getConnection("jdbc:h2:tcp://localhost/server~/dbname","username","password");
Run Code Online (Sandbox Code Playgroud)

这也意味着您需要以TCP模式启动服务器.实际上,它在文档中非常直接.

强制终止进程(适用于Windows的javaw.exe),并确保关闭可能已启动它的任何应用程序.你有一个主动锁.

  • 使用当前的H2,上面的DriverManager示例产生异常`在数据库URL中不允许隐式相对于当前工作目录的文件路径.相反,如果用`~`替换`server~`,它似乎工作正常. (2认同)

小智 13

我正在使用h2db与测试T24 tafj应用程序,我有同样的问题,但我设法通过识别运行h2的应用程序(当我尝试设置数据库连接时启动)来解决它.

ps aux|grep java
Run Code Online (Sandbox Code Playgroud)

将输出为:

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
Run Code Online (Sandbox Code Playgroud)

现在用它的进程id杀死它:

kill -9 22755
Run Code Online (Sandbox Code Playgroud)

最后删除锁定文件:

rm -f dbname.lock.db
Run Code Online (Sandbox Code Playgroud)


Sam*_*ehi 9

我有同样的问题。在Intellj中,当我想在程序运行时使用h2数据库时,出现了相同的错误。为了解决这个问题,我更改了连接网址

spring.datasource.url=jdbc:h2:file:~/ipinbarbot
Run Code Online (Sandbox Code Playgroud)

至:

spring.datasource.url=jdbc:h2:~/ipinbarbot;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE
Run Code Online (Sandbox Code Playgroud)

然后我的问题就消失了。现在我可以在程序运行时连接到“ ipinbarbot”数据库。如果您使用Hibernate,也不要忘记拥有:

spring.jpa.hibernate.ddl-auto = update
Run Code Online (Sandbox Code Playgroud)

祝好运


Fil*_*lip 7

您还可以从H2控制台访问"首选项"选项卡,然后按关机按钮关闭所有活动会话.


小智 6

简单步骤:进入任务管理器并杀死java进程

然后开始你的申请


Jac*_*bec 6

您也可以删除 h2 文件数据库的文件,问题就会消失。

jdbc:h2:~/dbname 表示将在用户主目录中创建名为 db name 的文件 h2 数据库(~/ 表示用户主目录,希望你在 Linux 上工作)。

在我的本地机器中,它存在于:/home/jack/dbname.mv.db 我不知道为什么文件的名称是 dbname.mv.db 而不是 dbname。可能是它的 h2 默认设置。我删除这个文件:

rm ~/dbname.mv.db 
Run Code Online (Sandbox Code Playgroud)

或者:

cd ~/ 
rm dbname.mv.db 
Run Code Online (Sandbox Code Playgroud)

数据库 dbname 将与所有数据一起删除。新数据库初始化后一切都会好起来的。


vim*_*hna 5

我从上面的萨曼·萨利希那里得到了线索。我的用例:为客户端负载平衡(运行两个REST的JVM实例)准备REST应用程序。在这里,我的MVC应用程序将调用此REST应用程序,该应用程序具有DATA的ActiveMQ后端。我在Eclipse中运行两个REST应用程序实例并尝试使用以下配置同时运行两个实例时遇到了问题

spring.datasource.url=jdbc:h2:file:./Database;
spring.jpa.properties.hibernate.hbm2ddl.auto=update
Run Code Online (Sandbox Code Playgroud)

添加后DB_CLOSE_ON_EXIT = FALSE; AUTO_SERVER = TRUE

spring.datasource.url=jdbc:h2:file:./Database;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE
Run Code Online (Sandbox Code Playgroud)

这两个实例都在运行并在Eureka仪表板上显示。

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

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

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