繁体   English   中英

HSQLDB 服务器模式用户名/密码

[英]HSQLDB server mode username/password

如果我使用我的 Java 代码在服务器模式下启动 HSQLDB,则服务器启动没有任何问题。 但是,当我尝试通过 Java 代码或通过 HSQLDB DatabaseManagerSwing 连接到它时; 我无法连接。

我在仅内存模式下使用 user=conn1 和 password=conn1 启动了服务器。 但是当连接到服务器时,它给了我以下异常:

java.sql.SQLInvalidAuthorizationSpecException: invalid authorization specification - not found: conn1

我只能通过提供 user=SA 和空白密码来连接。 我在 Windows7 机器上使用 HSQLDB 2.2.5 和 JRE1.7。

有人能告诉我我哪里做错了吗?

如果您使用最新版本的 HyperSQL 尝试这些服务器属性,您可能会收到一条错误消息,因为您的服务器属性不正确。 属性“server.username”和“server.password”无效。 并且dbname.0属性必须为小写。

如果要使用 SA 以外的用户名创建服务器数据库,可以将用户和密码附加到数据库路径:

server.database.0 = file:E:/DB/myDB;user=testuser;password=testpw
server.dbname.0 = mydb

服务器关闭后,不需要包含用户和密码。 凭据仅用于创建数据库。 之后,在与服务器建立连接时检查凭据。

由于评论中最近的问题,2020 年更新了更多信息:

  1. 只有在通过启动服务器创建新数据库时,才会考虑为database.0指定的用户名和密码。 如果在启动服务器之前数据库文件就存在,则用户名和密码是不必要的,只是被忽略。

  2. 新数据库的其他设置,例如hsqldb.tx=mvcc ,可以附加到database.0字符串。

  3. 您的服务器必须具有database.0属性。 如果您的服务器正在为两个不同的数据库提供服务,您可以为database.1添加属性。

  4. database.0指定的文件路径对连接到服务器的用户隐藏。 只有dbname.0值用于访问,例如: DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/mydb;uer=testuser;password=testpw")

  5. getConnection调用中,最好分别说明用户和密码以保持代码清晰: DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/mydb", "testuser", "testpw")

  6. 有关所有详细信息,请参阅指南http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

出现您遇到的问题(至少最初)是,对于内存数据库中的 HSQL,如果它是内存数据库中的“第一个”(即进程刚刚启动),则用户名“必须是”sa(用户名“sa”不区分大小写,或者它可以是空的用户名,这意味着“默认”也是 sa )。 您可以使用空白密码,或指定密码。 基于一些反复试验,如果您想稍后重新连接到相同的(内存中)数据库,则必须重新使用相同的密码(空白或其他)。 如果您想使用 SA 以外的用户,您可能必须首先使用 SA 连接到您的数据库并执行一些“创建用户”类型的命令来创建新用户。 然后使用该用户重新连接(假设您的数据库都在内存中)。

您可以像这样使用多个不同的内存数据库(如果这是您尝试通过指定不同用户来完成的):

// change the MySpecialTestDb String for multiple different in memory databases
// or reuse the same value
// to reconnect to a previously created in memory database [i.e. within the same process previously].
String DB_CONNECTION_STR = "jdbc:hsqldb:mem:MySpecialTestDb"; 
String DB_USERNAME_STR = "sa";
String DB_USERNAME_PASSWORD = "";
DriverManager.getConnection(DB_CONNECTION_STR, DB_USERNAME_STR, DB_USERNAME_PASSWORD);

您创建的每个新数据库都遵循相同的系统(它必须是初始用户 SA 并“采用”您提供的任何第一个密码)。

参考:http ://www.hsqldb.org/doc/1.8/guide/guide.html#advanced-chapter

或者,如果您只想“重置”内存数据库,例如在每个单元测试之间,请参见此处

请注意,文档还说“...此功能 [默认用户 SA] 具有可能使新用户感到困惑的副作用。如果在指定连接到现有数据库的路径时出错,仍然会建立到新数据库的连接数据库。出于故障排除目的,您可以指定连接属性 ifexists=true ..."

要点 1) 无论何时创建数据库,都必须指定用户名和密码。 你可以把它都留空; 但是连接到服务器时必须使用相同的用户名和密码。

如果您观察数据库的脚本文件,您可以看到如下命令:-

CREATE USER "usr" PASSWORD DIGEST '9003d1df22eb4d3820015070385194c8'
ALTER USER "usr" SET LOCAL TRUE
GRANT DBA TO "usr"

我用用户名“usr”创建了数据库,所以它出现在这些命令的脚本文件中。 现在在启动服务器时我不需要指定用户名或密码。 它会忽略这些信息。

在连接服务器时,您必须提供与创建数据库时完全相同的用户名和密码。

第 2 点)确保 DB 文件的路径中没有空格。 如果有空格,则将整个路径用双引号括起来。 我费了很大的劲才找出我这个愚蠢的错误。

现在,如果我在下面的命令中启动服务器,它会正确启动

1)转到HSQL的lib

cd C:\Users\owner\Documents\Java Project\hsqldb-2.2.9\hsqldb\lib

然后下命令

java -cp hsqldb.jar org.hsqldb.Server -database.0 file:"C:\Users\owner\Documents\Java Project\hsqldb-2.2.9\TmpDBLocation\myKauDB" -dbname.0 xdb

2)在其他命令提示符下转到lib位置

cd C:\Users\owner\Documents\Java Project\hsqldb-2.2.9\hsqldb\lib

然后通过在其他命令提示符窗口中给出命令来连接 HSQL DB 的 Swing UI

java -cp hsqldb.jar org.hsqldb.util.DatabaseManagerSwing --driver org.hsqldb.jdbcDriver --URL jdbc:hsqldb:hsql://localhost/xdb --user "usr" --password ""

在我全新的 2.3.2 安装中,单击bin/runServer.bat ,我设法使用以下方法连接(与 Squirrel):

URL: jdbc:hsqldb:hsql://localhost:9001
User: SA
Password: <blank>

暂无
暂无

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

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