尝试连接到 H2 数据库时出错

Error when trying to connect to H2 database

你们中有人在尝试连接到 H2 时遇到过以下错误吗? 我使用的版本是 1.4.199,在 windows,带有 TAFJFuctions。

首先我运行这个命令:
java -server -cp h2-1.4.199.jar;C:\Users\...\H2\TAFJFunctions.jar org.h2.tools.Server -web -tcp -tcpPort 9092 -tcpAllowOthers -baseDir C:\Users\...\H2\bin

并且我已经连接到 TCP 服务器 运行ning 和 Web 控制台服务器 运行ning。 然后我 运行 这个命令:
SET H2URL=jdbc:h2:tcp://locaLhost/t24db;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;TRACE_LEVEL_FILE=0;TRACE_LEVEL_SYSTEM_OUT=0;FILE_LOCK=NO;IFEXISTS=TRUE;CACHE_SIZE=8192;MVCC=TRUE;LOCK_TIMEOUT=60000

然后这个命令:
java -server -cp h2-1.4.199.jar;C:\Users\...\H2\TAFJFunctions.jar org.h2.tools.Shell -url %H2URL% -driver org.h2.Driver -user t24 -password t24

这里出现了以下错误:

"Exception in thread "main" org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database "C:/Users/.../H2/bin/t24db" not found, and IFEXISTS=true, so we cant auto-create it [90146-199]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:617)
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:427)
    at org.h2.message.DbException.get(DbException.java:205)
    at org.h2.message.DbException.get(DbException.java:181)
    at org.h2.engine.Engine.openSession(Engine.java:67)
    at org.h2.engine.Engine.openSession(Engine.java:201)
    at org.h2.engine.Engine.createSessionAndValidate(Engine.java:178)
    at org.h2.engine.Engine.createSession(Engine.java:161)
    at org.h2.server.TcpServerThread.run(TcpServerThread.java:160)
    at java.lang.Thread.run(Unknown Source)
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:617)
    at org.h2.engine.SessionRemote.done(SessionRemote.java:607)
    at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:143)
    at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:431)
    at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:317)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:169)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:148)
    at org.h2.Driver.connect(Driver.java:69)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at org.h2.tools.Shell.runTool(Shell.java:148)
    at org.h2.tools.Shell.main(Shell.java:81)"

知道如何让它工作吗?

谢谢, 嘉玲

这里的问题是没有名为 t24db 的数据库。

在你用来连接h2的属性 spring.datasource.url 属性中,去掉参数IFEXISTS=TRUE。 这将确保在数据库不存在时创建该数据库。

使用 IFEXISTS=TRUE 问题是不明显的,但如果没有此参数或尝试将其设置为 FALSE,情况将不会改变。

由于安全原因,所有最新版本的 H2 数据库默认不再允许远程(包括本地 TCP 连接)创建数据库。当它被允许时,每个可以连接到您的端口的人都可以创建一个新的数据库,在其中获得 ADMIN 权限,因此获得与您的 JVM 和您的用户帐户允许的相同的系统访问权限。

不幸的是,H2 1.4.199 会抛出一条令人困惑的错误消息,它仅在 1.4.200 中得到改进,在此版本中(未使用 IFEXISTS=TRUE 时)错误消息是“数据库...未找到” ,预先创建它或允许远程数据库创建(在安全环境中不推荐)”。

如果您使用 TCP(或 Pg/ODBC)服务器,您需要先以其他方式创建您的数据库,然后再尝试使用网络协议连接它们。

例如,您可以打开带有嵌入式 URL 的 JDBC 连接 (DriverManager.getConnection()) 并立即关闭它。

您可以将 org.h2.tools.Server 替换为 org.h2.tools.Console,您将看到另一个 http 连接 URL(如果您从命令行启动它),类似于 http://127.0.0.2:8082?key=12c58e1c5f9ce1ae88a2921f74e7655ed91a80746730cc6bfa8d4bbb464f69ee ;使用此 URL 您将能够从 Web 界面创建数据库(仅当未启用删除 Web 界面时)。

您也可以添加-tool参数(仅ConsoleServer不支持)来获取系统托盘中的H2控制台图标,其上下文菜单有一个创建新数据库的命令,这个图标也可以用相同的安全密钥打开网络界面。不要与任何人共享此密钥。但是,每次重启都会有所不同。

您还可以使用命令行 Shell 工具。

https://h2database.com/html/tutorial.html#creating_new_databases

在最坏的情况下,您可以启用删除数据库创建,但即使使用本地连接,它也不是真正安全的,并且在您的情况下启用远程连接时,它是完全不安全的。您的系统中会有一个众所周知的远程安全漏洞,我认为这不是您的意图。