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

问题描述 投票:-1回答:2

你们中的任何一个在尝试连接到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)"

任何想法如何使它正常工作?

谢谢,Carina

java connection h2
2个回答
0
投票

使用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控制台图标,其上下文菜单中包含创建新数据库的命令,以及此图标还可以使用相同的安全密钥打开Web界面。不要与任何人共享此密钥。但是,每次重新启动都会有所不同。

您也可以使用命令行外壳程序工具。

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.