HSQLDB

HSQLDB简介

HSQLDB is the leading SQL relational database engine written in Java.It is best known for its small size, ability to execute completely in memory and its speed

HSQLDB是一个用JAVA写的开源数据库,具有标准的SQL语法支持和JDBC接口,由于它的微型和性从而成为运行测试和演示Demo的最佳选择。我在第一次看到她时甚至高兴地跳了起来。你可以从http://hsqldb.sourceforge.net/免费下载并参阅文档。

您可以从命令行启动数据库服务器和实用工具,具体方法是调用像 org.hsqldb.Server org.hsqldb.util.DatabaseManager 这样的方便的类,这两个类均可以接受为数不多的一组命令行选项,如“-url”(用于远程连接)、“-database”(用于直接文件访问)和“-user”。还有一种“-?”选项也可以被接受,其作用是提供关于有效命令行语法的帮助。

造成 HSQLDB 简单性的关键因素是SQL语句执行的顺序化。也就是说,尽管许多并发用户可以连接到数据库上(当数据库以服务器模式运行时),但是所有 SQL 语句都被放到一个队列中,然后一次执行一条。因此不需要实现复杂的锁定及同步算法。

² HSQLDB的执行方式:

1. 内存驻留模式(all in Memory-Only

所谓全内存访问模式,就是所有的数据(包括索引和记录)都保存在内存里,数据不会持久化。这意味着数据库的大小是受到内存大小的限制的(不能超过内存的大小)。通过在建立JDBC连接时提供jdbc:hsqldb:.URL来进入这种执行模式。需要注意的是:in-memory方式只能运行在一个connection之中,每当关闭一个connection,数据都会丢失.如果同时执行两个操作数据库的方法(每一个方法之中都会有打开/取得和关闭/返回connection),例如:

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

public void testCreateAndDrop() {

export.create(systemIds);

export.drop(systemIds);

}

而在createdrop方法中,都会有:

public void execute(String sql) {

openConnection();

execute(sql);

closeConnection();

}

在这种情况下,当程序取得connection,在数据库中创建table,然后返回connection,这时刚才数据库中的数据就会自动丢失.因此,当运行到drop方法时,它就会创建新的数据库,此时create方法中创建的table已经不存在了.所以这种方式一般多用于无状态测试中。

2. 单机模式(In-Process (Standalone) Mode

应用程序使用 JDBC 创建一个数据库连接,并且 HSQLDB引擎作为该应用程序的一部分与其运行在同一JVM进程中。在这个模式下,不能存在并发用户(应用程序独占地访问数据库文件,数据库文件被加锁),同一时间一个数据库只能有一个应用程序访问。这意味这在程序运行期间无法运行数据库管理工具进行管理。

这种模式下的JDBCURL如下:jdbc:hsqldb:zzq这里,test是数据库文件名。另一个例子(WINDOWS系统下):jdbc:hsqldb:c:\db\zzq

在这种模式下,数据库引擎在第一次连接建立时启动。如果指定的文件不存在,则在当前目录建立3个文件:zzq.propertyzzq.lckzzq.log。你可以在建立连接时指定ifexists=true来阻止数据库自动建立不存在的数据库,这样在getConnection()时会抛出异常。当数据库关闭时,将所有sql语句写入文件zzq.script中,并删除zzq.lck。下次数据库启动时通过zzq.script在内存重建数据库。

3. 服务器模式

这是类似于其他关系数据库的标准客户机/服务器数据库配置,允许出现使用 TCP 套接字的并发连接。大部分开发人员喜欢这种模式,因为它允许任何 JDBC 客户机在主应用程序仍在运行的情况下连接并查询/更新表。

可以以如下的方式启动数据库zzq
java -cp ../lib/hsqldb.jar org.hsqldb.Server –database zzq
可用参数如下表:

+----------------+------------+----------+------------------------------+

| OPTION | TYPE | DEFAULT | DESCRIPTION |

+----------------+------------+----------+------------------------------|

| -? | -- | -- | prints this message |

| -address | name | any | server inet address |

| -port | number | 9001/544 | port at which server listens |

| -database | path | test | name of the database |

| -silent | true|false | true | false => display all queries |

| -trace | true|false | false | display JDBC trace messages |

| -tls | true|false>| false | TLS/SSL (secure) sockets |

| -no_system_exit| true|false | false | do not issue System.exit() |

+----------------+------------+----------+------------------------------+

连接方式:

 Connection c = DriverManager.getConnection(
 "jdbc:hsqldb:hsql://localhost/xdb", "sa", "");

4. Web服务器模式和servlet模式

HSQLDB 可以以 Web 服务器的形式启动,它允JDBC驱动通过 HTTP 执行SQL 语句;也可以以标准的 servlet 来运行。这种模式主要用于需要穿透防火墙的情况下。从1.7.2开始支持事务。

要以web服务器模式启动数据库,请执行下面语句:

Java org.hsqldb.WebServer –database zzq

其他可用参数见下表:

+----------------+------------+------------+------------------------------+

| OPTION | TYPE | DEFAULT | DESCRIPTION |

+----------------+------------+------------+------------------------------|

| -? | -- | -- | prints this message |

| -address | name | any | server inet address |

| -port | number | 80/443 | port at which server listens |

| -database | name | test | name of the database |

| -root | path | ./ | path to web root |

| -default_page | file | index.html | default web page |

| -silent | true|false | true | false => display all queries |

| -trace | true|false | false | display JDBC trace messages |

| -tls | true|false | | HTTPS (secure) sockets |

| -no_system_exit| true|false | false | do not issue System.exit() |

+----------------+------------+------------+------------------------------+

Servlet的启动其实是由web服务器启动的,具体需要这样配置:参见hsqlServlet.java中的说明,这种方式只实用于单一数据库。

连接方式:

 Connection c = DriverManager.getConnection(
 "jdbc:hsqldb:hsql://localhost/xdb", "sa", "");

5. 几种使用模式的总结

在具体的应用中,一般all in memory主要用于测试。单机模式往往和普通服务器模式相结合,程序开发时使用server模式,在真正部署时再使用单机模式。

6. 数据库建立

当数据库启动时,或者在单机模式中的连接建立时,默认的行为是:如果指定的数据库不存在就建立一个空的。

7. 数据库关闭

在所有的模式下都可以永SHUTDOWN名令来关闭,原来在单机模式下当最后一个连接关闭时数据库自动关闭,在1.7.2版本中必须显式的调用SHUTDOWN才行!当调用此命令的时候所有活动的事务都会回滚。稍有区别的是SHUTDOWN COMPACT命令:A special form of closing the database is via the SHUTDOWN COMPACT command. This command rewrites the .data file that contains the information stored in CACHED tables and compacts it to size. This command should be issued periodically, especially when lots of inserts, updates or deletes are performed on the cached tables. Changes to the structure of the database, such as dropping or modifying tables or indexes also create large amounts of unused space that can be reclaimed using this command.

² HSQLDB 数据库存储结构:

HSQLDB 将所有表和索引数据放在内存中, 将所有发出的 SQL 语句保存到一个名为 database.script 的文件中,该文件同时也充当着事务日志的角色。初始化引擎之后,该文件被读取,然后其中所有的 SQL 语句都被运行,从而完成整个数据库的重建。停机期间,HSQLDB 引擎将生成一个新的 database.script 文件,其中只包含最少的语句,目的是让数据库可以快速启动。

除了默认放在内存中的表之外,HSQLDB 还支持“缓存”表和“文本”表。所有缓存表的数据放在一个名为 database.data 的文件中,而文本表的数据则放在由 set table source 非标准 SQL 语句命名的任意分隔文本文件(像 CSV 文件)中。缓存表支持比可用 RAM 大的数据集,而文本表则可以作为一种导入导出数据的方便手段。

除了 database.script database.data 文件之外,任何 HSQLDB 数据库还可能包含一个 database.properties 文件,管理员可以在该文件中设置许多影响到 ANSI SQL 兼容性的参数。所有数据库文件(文本表数据文件除外)必须放在同一个目录中。

不存在创建 HSQLDB 数据库的显式方法。如果您要求引擎打开一个目前不存在的数据库文件(使用服务器模式的 -database 选项或单机模式的 JDBC URL),就会创建该文件及其所在目录。所以,如果您肯定那个空数据库中存在数据,请检查是否有录入错误。

可以看出HSQLDB对于单元测试非常有利:使用hsqldb,速度非常快,而且当使用in-memory方式来测试单一方法时,完全不要考虑完整性,不一致性等问题.每当connection断开后,数据会自动清除。

你可能感兴趣的:(sql,应用服务器,jdbc,SQL Server,HSQLDB)