繁体   English   中英

尝试连接到 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 服务器和正在运行的 Web 控制台服务器。 然后我运行了这个命令:
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)"

知道如何让这个工作吗?

谢谢你,卡琳娜

使用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 Console 图标,其上下文菜单中有一个创建新数据库的命令,此图标也可以打开网页具有相同安全密钥的接口。 不要与任何人共享此密钥。 但是,每次重启都会有所不同。

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

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

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

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

在用于连接到 h2 的属性 spring.datasource.url 属性中,删除参数 IFEXISTS=TRUE。 如果数据库不存在,这将确保创建该数据库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM