初始化 HSQLDB 实例,然后在应用程序中使用它

Posted

技术标签:

【中文标题】初始化 HSQLDB 实例,然后在应用程序中使用它【英文标题】:Initializing an HSQLDB instance and then using it in an app 【发布时间】:2014-10-29 16:57:00 【问题描述】:

我对嵌入式数据库的概念是全新的,并选择HSQLDB 作为我的 Java 应用程序的嵌入式数据库。我认为我从根本上不理解某些东西:我看不到如何/在哪里:

定义必须用于连接数据库的用户名/密码凭据 创建新数据库(例如,db_myapp) 为该新数据库创建表

对于非嵌入式(“普通”)数据库,我将首先使用数据库客户端连接到数据库,CREATEdb_myapp 数据库以及它应该具有的任何表。然后,我的应用会期望这些表在运行时存在。

但使用 HSQLDB,我没有可连接的数据库服务器,因此在我的应用程序运行之前,我看不到如何/在哪里可以提前创建这些数据库/表/凭据。

也许这正是“嵌入式”数据库所做的;也许它是嵌入在 JDBC 驱动程序中的整个 DB? 无论如何,我仍然需要一种方法来完成上面列出的 3 件事。

我唯一能想到的就是每次我的应用启动时运行一些初始化代码。此代码将检查这些构造是否存在,如果它们不存在,则会创建它们。

这里有几个问题:

这种方法可能适用于数据库和表,但不适用于 JDBC Connection 本身所需的凭据。如何/在哪里创建这些? 我什至不确定这是否是使用嵌入式 HSQLDB 的正确/正常方法;有人可以确认我的工作进展顺利(即“check-to-see-if-it-exists-and-if-not-then-create”方法)吗? 如果我不小心执行了尝试创建新数据库/表前夕的代码,当它已经存在时会发生什么? HSQLDB 会忽略它还是会破坏我现有的数据库/表?

【问题讨论】:

【参考方案1】:

简短的回答是,您几乎走在正确的轨道上。

连接嵌入式数据库和连接普通的数据库服务器真的没有什么区别,只是连接字符串有点不同。 This section 有这方面的信息。问题是您实际上没有单独的“数据库”可供选择,它只是在连接字符串中指定。对于连接:

Connection c = DriverManager.getConnection("jdbc:hsqldb:file:/opt/db/testdb", "SA", "");

这将为您提供与嵌入式数据库引擎的连接,该引擎将数据保存在/opt/db/testdb 的文件中。嵌入式数据库的默认用户名始终是“SA”,没有密码。老实说,我不知道它是否会起作用,但如果你真的需要设置不同的密码,你可以尝试执行ALTER USER SA SET PASSWORD <newPassword>。它可能会工作......

就创建表等而言,有几种方法可以解决此问题,具体取决于数据库是作为文件保存还是在内存中保存。通常,嵌入式数据库用于非常简单的数据,因此通过在初始化连接后立即执行语句来创建表。 CREATE TABLE IF NOT EXISTS ... 是通常的做事方式。这允许您仅在表不存在时创建表。

如果您使用的是基于文件的数据库,那么 hsqldb 为您提供了另一种选择。看看this documentation 关于使用他们的工具访问数据库的信息。这将允许您提前创建基于文件的数据库,并设置用户名/密码等内容并设置所有表。然后,您可以复制结果文件以供您的应用程序使用。然后一切都将在您的应用程序连接到它之前设置。

所以最终,您可以选择任何一种方式。您可以在连接初始化时让应用程序设置所有内容,也可以提前手动设置。我的偏好是让应用程序在代码中设置它,因为这样您的表定义就会更接近实际使用它们的代码。不过,我还没有使用过像这样的嵌入式数据库来处理非常复杂的数据,所以我不能老实说它的扩展性如何。

【讨论】:

以上是关于初始化 HSQLDB 实例,然后在应用程序中使用它的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB 数据库多连接

如何为 Quartz 调度程序设置 HSQLDB 模式

连接到 IDE 中现有的 hsqldb 实例

从 hsqldb 备份中仅导入特定行

使用url设置hsqldb的时区

Worklight 控制台初始化失败。记录的异常:org.hsqldb.HsqlException:内存不足