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

时间:2020-03-03 14:00:04

标签: java connection h2

尝试连接H2时,您是否有人遇到以下错误? 我正在使用的Windows版本是1.4.199,带有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)"

有什么想法可以使它正常工作吗?

谢谢, 船长

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

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

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

相关问题