Dorado 5 : 2.1.HSqlDB简介以及使用 (T22)

简介

hsql 数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议,如果你是使用Java编程的话,不凡考虑一下使用它,相对其他数据库来说,其体积小,才563kb。仅一个hsqldb.jar文件就包括了数据库引擎,数据库驱动,还有其他用户界面操作等内容。在Java开源世界里,hsql是极为受欢迎的(就Java本身来说),JBoss应用程序服务器默认也提供了这个数据库引擎。由于其体积小的原因,又是纯Java设计,又支持 SQL99,SQL2003大部分的标准,所以也是作为商业应用程序展示的一种选择。

HSqlDB涉及的文件

每个Hsqld数据库包含了2到5个命名相同但扩展名不同的文件,这些文件位于同一个目录下。例如,名为"test"的数据库包含了以下几个文件:

  • test.properties
  • test.script
  • test.log
  • test.data
  • test.backup

properties文件描述了数据库的基本配置。 script文件记录了表和其它数据库对象的定义。log文件记录了数据库最近所做的更新。data文件包含了cached(缓冲)表的数据,而backup文件是将data文件压缩备份,它包含了data文件上次的最终状态数据。所有这些文件都是必不可少的,千万不可擅自删除。但如果你的数据库没有缓冲表(cached table),test.data和test.backup文件是不会存在。

各种模式的介绍

HSqlDB具有Server模式,进程内模式(In-Process)和内存模式(Memory-Only)三种。下面分别来介绍。

Server模式 

Server模式提供了最大的可访问性。应用程序(客户端)通过Hsqldb的JDBC驱动连接服务器。在服务器模式中,服务器在运行的时候可以被指定为最多10个数据库。根据客户端和服务器之间通信协议的不同,Server模式可以分为以下三种:
1、 Hsqldb Server
这种模式是首选的也是最快的。它采用HSQLDB专有的通信协议。启动服务器需要编写批处理命令。Hsqldb提供的所有工具都能以java class归档文件(也就是jar)的标准方式运行。假如hsqldb.jar位于相对于当前路径的../lib下面。那么命令将这样写:

java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 demoDB

现在你可能会疑惑,[-database.0 ]、 [dbname.0]为什么在后面加[0]。_... ...刚刚不是在前面说服务模式运行的时候可以指定10个数据库吗,如有多个数据库,则继续写命令行参数-database.1 aa -dbname.1 aa -database.2 bb-dbname.2 bb ... ...
新建文本文件保存上面命令,文件名可以随意,将后缀名改成bat,然后直接执行批处理文件即可。在以后介绍的执行启动工具的命令采用同样方法。
上面启动服务器的命令启动了带有一个(默认为一个数据库)数据库的服务器,这个数据库是一个名为"mydb.*"文件,这些文件就是mydb.Properties、mydb.script、mydb.log等文件。其中demoDB是mydb的别名,可在连接数据库时使用。


2、 Hsqldb Web Server
  这种模式只能用在通过HTTP协议访问数据库服务器主机,采用这种模式唯一的原因是客户端或服务器端的防火墙对数据库对网络连接强加了限制。其他情况下,这种模式不推荐被使用。
运行命令如下:

 java -cp ../lib/hsqldb.jar org.hsqldb.WebServer -database.0 mydb -dbname.0 demoDB

 

3、 Hsqldb Servlet
    这种模式和Web Server一样都采用HTTP协议,当如Tomcat或Resin等Web容器提供数据库的访问时,可以使用这种模式。但是Servlet模式不能脱离Web容器独立启动。为了提供数据库的连接,必须将hsqldb.jar中的hsqlServlet类放置在应用服务器的相应位置。

Web Server和Servlet模式都只能在客户端通过JDBC驱动来访问。Servlet模式只能启动一个单独的数据库。请注意做为应用程序服务器的数据库引擎通常不使用这种模式。

 

In-Process模式

  In-Process模式又称Standalone模式。这种模式下,数据库引擎作为应用程序的一部分在同一个JVM中运行。对于一些应用程序来说, 这种模式因为数据不用转换和通过网络的传送而使得速度更快一些。其主要的缺点就是默认情况下不能从应用程序外连接到数据库。所以当应用程序正在运行的时候,你不能使用类似于Database Manager的外部工具来查看数据库的内容。在1.8.0版本中,你可以从同一个JVM的一个线程里面来运行一个服务器实例,从而可以提供外部连接来访问你的In-Process数据库。
  推荐的使用In-Process模式方式是:开发的时候为数据库使用一个HSQLDB Server模式,然后在部署的时候转换到In-Process模式。
一个In-Process模式数据库是从JDBC语句开始启动的,在连接URL中带有指定的数据库文件路径作为JDBC的一部分。例如,假如数据库名称为testdb,它的数据库文件位于与确定的运行应用程序命令相同的目录下,下面的代码可以用来连接数据库:

Connection c = DriverManager.getConnection("jdbc:hsqldb:file:testdb", "sa", "");

数据库文件的路径格式在Linux主机和Windows主机上都被指定采用前斜线("/")。所以相对路径或者是相对于相同分区下相同目录路径的表达方式是一致的。使用相对路径的时候,这些路径表示的是相对于用于启动JVM的Shell命令的执行路径。

Memory-Only数据库

Memory-Only数据库不是持久化的而是全部在随机访问的内存中。因为没有任何信息写在磁盘上。这种模式通过mem:协议的方式来指定:

 Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:dbName", "sa", "");

你也可以在server.properties中指定相同的URL来运行一个Memory-Only服务器实例。

注意事项:当一个服务器实例启动或者建立一个in-process数据库连接的时候,如果指定的路径没有数据库存在,那么就会创建一个新的空的数据库。这 个特点的副作用就是让那些新用户产生疑惑。在指定连接已存在的数据库路径的时候,如果出现了什么错误的话,就会建立一个指向新数据库的连接。为了解决这个 问题,你可以指定一个连接属性ifexists=true只允许和已存在的数据库建立连接而避免创建新的数据库,如果数据库不存在的 话,getConnection()方法将会抛出异常。

使用HSqlDB

最后介绍一下HSqlDB提供的工具的使用。由于在项目中会使用以Server模式运行的HSql,下面只介绍以Server模式运行的使用方法。
为了便于操作,需要把这些工具启动的命令做成批处理文件。方法和前面所介绍的创建启动服务模式命令的方法一样。在这里再强调一次hsqldb.jar的位置,因为所有启动命令都是参照hsqldb.jar的位置编写的。如果您觉得麻烦也可以采用绝对路径编写命令。

启动Server模式的HSqlDB

下面启动一个以Server模式运行的HSqlDB。hsqldb.jar位于相对于当前路径的../lib下面,新建一个runServer.bat文件,内容如下:

java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 demoDB

运行成功后如下图所示:

启动DatabaseManager

现在开始运行AWT版本的DatabaseManager工具,同样hsqldb.jar需要位于相对于当前路径的../lib下面,命令如下:

 Java -cp ../lib/hsqldb.jar org.hsqldb.util.DatabaseManager

将命令保存为后缀名为bat的批处理文件,保存为runManager.bat,也可根据个人习惯命名。执行runManager.bat你将看到如下画面:

现在对这个简洁的登录界面做个简单的介绍。

参数

说明

Recent

选择你最近的登录方案,[可选] 

Setting Name

本次登录方案名称,如果本次登录成功,那么等你下次登录的时候在Recent下拉列表中将看到你的成功登录方案[可选] 

Type

登录模式,其中包括In-Memory模式、Standalone(In-process)模式、Server模式、WebServer模式... ...[必选] 

Driver

连接数据库的驱动程序[必选] 

URL

连接数据库的URL[必选] 

User

数据库登录用户名[必选] 

Password

数据库登录密码[ 除非密码为空]

DB CharSet

数据所采用的编码格式[可选]

在Type中选择HSQL Database Engine Server,在url中输入jdbc:hsqldb:hsql://localhost/ demoDB,点击OK按钮,就可以对demoDB进行管理了。

注:如果Type项选择Server模式或者WebServer模式需要你事先启动与之对应的服务模式。而Standalone(In-process) 默认是不支持DatabaseManager连接的,具体原因已经在前面解释过。至于In-Memory可以随意登录,所有的操作数据都不会记录在本地磁 盘。而Type还有很多其他选项,具体的用法可以参考官方文档,位置在hsqldb目录\doc\guide\ guide.pdf。

启动DatabaseManagerSwing

如果你想运行DatabaseManagerSwing,只需要把启动DatabaseManager命令修改成:

 Java -cp ../lib/hsqldb.jar org.hsqldb.util. DatabaseManagerSwing

两种工具的操作方法类似,这里就不再赘述。

修改用户密码

下面讲一下修改sa用户密码的方法。当你用SA通过DatabaseManager登录成功后会出现如下界面:

在右上方的空白区域输入set password "newpassword", 点击执行即可。