我正在尝试使用Java应用程序中的H2数据库。
我通过H2控制台创建了数据库及其表,然后尝试使用
从Java连接Connection con = DriverManager.getConnection("jdbc:h2:~/dbname", "username", "password");
但是我收到以下错误:
线程“main”中的异常org.h2.jdbc.JdbcSQLException:数据库可能已在使用中:“被另一个进程锁定”。可能的解决方案:关闭所有其他连接;使用服务器模式[90020-161]
我尝试删除dbname.lock.db
文件,但会自动重新创建。
如何解锁数据库以便从我的Java程序中使用它?
答案 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
答案 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)
答案 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