2014-10-29 108 views
1

我是嵌入式数据库概念的新手,并选择HSQLDB作为我的Java应用程序的嵌入式数据库。我想我根本不理解的东西:没有在任何地方我看到如何/在哪里:初始化HSQLDB实例,然后在应用程序中使用

  • 定义必须用于连接到数据库
  • 创建一个新的数据库的用户名/密码凭证(e..g ,db_myapp
  • 为新的数据库

对于非嵌入式(“正常”)DB创建表,我会首先使用DB客户端连接到数据库,并CREATEdb_myapp DB以及作为它应该有的任何表格。我的应用程序然后期望这些表在运行时存在。

但是对于HSQLDB,我没有这样的数据库服务器来连接,所以我没有看到我的应用程序在运行之前如何/在哪里创建这些数据库/表/凭证。

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

我唯一能想到的就是每次启动应用程序时都运行一些初始化代码。这段代码会检查这些结构的存在,如果它们不存在,那么它会创建它们。

这里有几个问题:

  • 这种做法可能与数据库和表工作,但没有证书,我需要在JDBC Connection本身。我如何/在哪里创建这些?
  • 我甚至不确定这是使用嵌入式HSQLDB的正确方法吗?有人可以确认我正在跟踪(也就是说,“检查 - 看看,如果它存在和如果没有,然后创建”的方法)?
  • 如果我意外地执行了代码,当它已经存在时尝试创建新的数据库/表格前夕,会发生什么情况? HSQLDB会忽略它还是会吹掉我现有的DB /表?

回答

2

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

除了连接字符串有点不同外,连接到嵌入式数据库与连接到普通数据库服务器确实没有区别。 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关于使用他们的工具访问数据库。这将允许您提前创建基于文件的数据库,并设置用户名/密码等内容并设置所有表格。然后您可以复制生成的文件以供应用程序使用。然后,在应用程序连接到它之前,将设置所有内容。

因此,最终,你可以选择任何一种方式。您可以让应用程序在初始化连接时设置所有内容,也可以提前手动进行设置。我的首选是让应用程序在代码中设置它,因为这样你的表定义就更接近实际使用它们的代码。尽管如此,我还没有使用像这样的嵌入式数据库来处理复杂的数据,所以我不能诚实地说出这种规模有多好。