数据库可能已在使用中 - H2 问题

Database may be already in use - H2 issue

在使用 H2 数据库时有时会出现以下异常。如果我将数据库文件的路径更改为另一个位置,这个问题就会得到解决。这个问题有没有永久的解决方案。我的数据库现在是 19.5MB。

org.h2.jdbc.JdbcSQLException: Database may be already in use: "/opt/new/mockdata_db.mv.db". Possible solutions: close all other connection(s
); use the server mode [90020-178]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:344) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.message.DbException.get(DbException.java:167) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:104) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.engine.Database.getPageStore(Database.java:2355) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.engine.Database.open(Database.java:659) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.engine.Database.openDatabase(Database.java:262) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.engine.Database.<init>(Database.java:256) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.engine.Engine.openSession(Engine.java:57) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.engine.Engine.openSession(Engine.java:164) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.engine.Engine.createSessionAndValidate(Engine.java:142) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.engine.Engine.createSession(Engine.java:125) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.engine.Engine.createSession(Engine.java:27) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:335) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:107) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:91) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.Driver.connect(Driver.java:74) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.jdbcx.JdbcDataSource.getJdbcConnection(JdbcDataSource.java:191) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.jdbcx.JdbcDataSource.getXAConnection(JdbcDataSource.java:354) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.jdbcx.JdbcDataSource.getPooledConnection(JdbcDataSource.java:386) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.jdbcx.JdbcConnectionPool.getConnectionNow(JdbcConnectionPool.java:228) ~[h2-1.4.178.jar:1.4.178]
        at org.h2.jdbcx.JdbcConnectionPool.getConnection(JdbcConnectionPool.java:200) ~[h2-1.4.178.jar:1.4.178]

一个永久的解决方案是在堆栈跟踪中:使用服务器模式而不是嵌入式模式。这意味着更改代码中的 JDBC url 并在 JDBC.

中使用 tcp 模式

一个有趣的替代方案是以自动混合模式打开:第一个连接是嵌入式的,所有后续连接都是 tcp 模式。这也改变了 JDBC url,但看起来更自然,我个人在 1.3 和 1.4 版本的 H2 中系统地使用了它。

只需将 ";AUTO_SERVER=TRUE" 附加到您之前的 JDBC url 即可使用自动混合模式。