尝试连接到 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
参数(仅Console
,Server
不支持)来获取系统托盘中的H2控制台图标,其上下文菜单有一个创建新数据库的命令,这个图标也可以用相同的安全密钥打开网络界面。不要与任何人共享此密钥。但是,每次重启都会有所不同。
您还可以使用命令行 Shell 工具。
https://h2database.com/html/tutorial.html#creating_new_databases
在最坏的情况下,您可以启用删除数据库创建,但即使使用本地连接,它也不是真正安全的,并且在您的情况下启用远程连接时,它是完全不安全的。您的系统中会有一个众所周知的远程安全漏洞,我认为这不是您的意图。
你们中有人在尝试连接到 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
参数(仅Console
,Server
不支持)来获取系统托盘中的H2控制台图标,其上下文菜单有一个创建新数据库的命令,这个图标也可以用相同的安全密钥打开网络界面。不要与任何人共享此密钥。但是,每次重启都会有所不同。
您还可以使用命令行 Shell 工具。
https://h2database.com/html/tutorial.html#creating_new_databases
在最坏的情况下,您可以启用删除数据库创建,但即使使用本地连接,它也不是真正安全的,并且在您的情况下启用远程连接时,它是完全不安全的。您的系统中会有一个众所周知的远程安全漏洞,我认为这不是您的意图。