hsqldb是一个完全用java编写的数据库,既可以独立运行也可以嵌入java开发的项目中。整个jar包只有600多K,是测试和演示时的极品选择。
首先我们要下载hsqldb,他们的官方网站在http://www.hsqldb.org ,下载了zip发布包找到里边的hsqldb.jar,这就是我们需要的数据库程序。
写一个测试连接的程序。
import java.sql.DriverManager;
import java.sql.Connection;
public class DbUtils {
public static void main(String[] args)
throws Exception { Class.forName(
"org.hsqldb.jdbcDriver" ); String url =
"jdbc:hsqldb:mem:." ; String username =
"sa" ; String password =
"" ; Connection conn = null;
try { conn = DriverManager.getConnection(url, username, password); System.out.println(
"成功连接到数据库:" + conn); }
catch (Exception ex) { System.out.println(
"连接失败:" + ex); }
finally {
if (conn != null) { conn.close(); } } } }
加载驱动程序类名是org.hsqldb.jdbcDriver,它就在hsqldb.jar中。
连接数据库使用的用户名为sa,密码为空,这是默认的数据库管理员。
数据库连接的url地址是jdbc:hsqldb:mem:.。所有jdbc连接url都是以jdbc开头的,第一个冒号后便的部分是使用的驱动别 名,这里的hsqldb就代表我们将使用org.hsqldb.jdbcDriver,第二个冒号后是每个数据库自己特定的访问地址,这里的mem:.表 示使用内存存储模式,连接的数据库名称是“.”。
之前提到hsqldb支持单独运行和嵌入调用两种,在此我们讨论一下这两种调用方式的利弊。
-
嵌入调用
hsqldb是完全使用java编写的,我们可以在自己写的程序里调用hsqldb,就像启动一个普通的线程一样,让hsqldb与我们的程序运行在同一个jvm中。
像 我们上面的例子中使用的就是嵌入调用的形式。DbUtils执行的过程中会启动hsqldb服务器并与之建立连接,在关闭连接释放资源后,jvm关闭的同 时也将hsqldb服务器关闭。DbUtils和hsqldb运行在同一个jvm上,共享这个jvm分配的内存等资源。
-
单独运行
单独启动一个jvm运行hsqldb,客户程序与服务器程序运行在不同的jvm中,双方通过socket交换数据,客户程序的启动和关闭不会直接影响hsqldb。
我们可以使用它自带的org.hsqldb.Server,启动脚本如下。
set classpath=hsqldb-1.8.0.7.jar java org.hsqldb.Server
org.hsqldb.Server会自动去读取server.properties中的配置。
server.port=9100 server.database.0=mem:test server.dbname.0=test
这里启动一个监听9100端口的hsqldb服务器,服务器中包含一个数据库,使用mem:test的存储方式,对外的数据库名称是test。
为了连接这个数据库,需要修改连接数据库使用的url。
String url = "jdbc:hsqldb:hsql://localhost:9100/test"
hsql表示我们将使用hsqldb自身的socket方式进行连接。连接的数据库在localhost的9100端口,test是我们需要进行连接的数据库名称。
如果希望关闭hsqldb数据库,可以直接关闭java弹出的console窗口。
hsqldb拥有四种存储数据的方式,之前见过的有mem和hsql,下面来介绍一下它们的用法和区别。
-
mem,内存(memory)存储方式。
hsqldb启动的时候会在内存中建立对应的表结构,运行期间对数据做出的所有修改都保存到内存中,最后关闭hsqldb的同时,内存中的所有数据也会全部丢失。
示例代码02-03/Mem.java中,首先创建表结构,并向数据库中写入两条语句:
String[] sqls = { "create table test(id bigint,name varchar(200))" , "insert into test(id,name) values(1,'lingirl')" , "insert into test(id,name) values(2,'叮咚')" };
然后执行查询,可以看到两条数据已经成功保存进数据库了。
1 lingirl 2 叮咚
mem方式的缺点是每次启动hsqldb都要先创建表结构,插入初始数据,关闭hsqldb的同时数据也会全部丢失。
mem方式的优点是所有操作都在内存中进行,不会生成额外的数据文件,可以保证每次创建的数据库都是绝对干净的,这点对测试来讲很有用。
-
file,文件存储方式。
hsqldb使用文件保存数据库配置,表结构和更新的数据。
hsqldb运行过程中会生成四个文件,它们的文件名都是与连接url地址对应的,示例02-03/File.java中配置的url为"jdbc:hsqldb:file:db/file",对应的将是db目录下所有以file开头的文件。
-
file.properties存放数据库配置,包括数据库版本,缓存,表结构设置等等。
-
file.lck用来标记当前数据库是否已经被某一个hsqldb访问了,同一时间只有一个hsqldb能操作数据库文件,这样才能保证不会出现数据冲突。
这个文件在hsqldb启动时自动生成,正常关闭时会自动删除,但非法关闭会无法删除这个文件,如果因为这个文件出现数据库服务启动的情况,就需要手工删除。
-
file.script和file.log
hsqldb使用这两个文件保存数据表结构和数据,因为用到了缓存,更新的数据不会直接写入文件,而是在内存中积累一定量后,才会批量写入file.log这个日志文件。
file.script用来保存最终数据,hsqldb正常关闭的时候会把内存和日志文件(file.log)中的数据写入file.script,并删除日志(file.log)文件。
如果出现非正常关闭的情况,内存中缓存的数据会丢失,file.log也无法删除,不过不用担心,下次启动的时候hsqldb会先检测是否有未删除的file.log,将其中的数据写入file.script,再读取file.script中的数据,进行初始化操作。
File.java中的sql语句有了变化,因为使用文件保存了表结构,每次操作之前还是先删除它们比较保险。
String[] sqls = { "drop table test if exists" , "create table test(id bigint,name varchar(200))" , "insert into test(id,name) values(1,'lingirl')" , "insert into test(id,name) values(2,'叮咚')" };
多了这条清空语句,我们可以得到与mem相同的查询结果,如果不删除表 ,把插入语句修改成不冲突的形式,我们就可以看到每次查询结果不断增多。因为即使hsqldb关闭了,数据也会保存在文件里。
拜 缓存所赐,像我们这样放任hsqldb随jvm关闭,一定会丢失数据,为了这一点,我们在url上加入了特殊标记String url = "jdbc:hsqldb:file:db/file;shutdown=true",保证每次conn.close()都会关闭数据,将数据写入 file.script,相对的也使缓存完全丧失了效果。
当然,也可以向数据库发送shutdown语句,正常关闭数据库。
-
res,资源存储方式。
它 是mem与file两者的结合,我们把res.properties和res.script放到classpath下的db/目录下,对应url = "jdbc:hsqldb:res:/db/res"。数据库启动的时候会去这两个文件里读取数据进行初始化,但不会生成res.lck和 res.log,以后进行的所有操作就都在内存里了,关闭数据库也不会写入res.script。
res就像是使用file提供初始数据的mem内存访问方式,它在系统演示的时候十分方便,设置一次初始数据就可以演示多次,而且不会影响初始数据的结果。用于测试就不太适合了,res.script明显没有sql语句便于维护,还是老老实实用sql导入更合适。
res唯一的限制是不能进行建表和删表的操作,你可以插入,修改,删除数据,但是不能修改表的结构。
-
hsql,socket访问方式。
使用socket链接,从一个单独运行的hsqldb服务器中获得数据,这个服务器中的hsqldb又可能是这四种存储方式。只要你想,就完全可以做成一条链状结构。
第一种方式,url = "jdbc:hsqldb:file:db/file;shutdown=true",这样每次conn.close()都会执行shutdown命令关闭数据,实际上扼杀了缓存的效果。
另一个方式,在jvm关闭前,向数据库发送shutdown命令,让它正常关闭。
分享到:
相关推荐
以下是对HSQldb快速入门的详细讲解: **安装与配置** HSQldb可以从其官方网站(http://www.hsqldb.org/)下载最新稳定版,解压缩后,你会在`doc`目录下找到`User Guide`,这是HSQldb的官方用户手册,包含了详细的...
本项目"spring-adventure-football-manager"旨在引导初学者通过Spring MVC、Hibernate、JPA和Hsqldb来创建一个入门级的足球经理应用程序,这是一次极好的学习实践机会。 1. **Spring MVC**: Spring MVC是Spring...
在快速入门文档中,你可能会学习到如何下载和添加这两个jar包到你的项目中。通常,只需要将hsqldb.jar和sqltool.jar添加到项目的类路径中,就可以在Java代码中创建数据库连接并执行SQL语句。对于命令行使用,你可以...
3. **UNIX下快速起步**:提供了一套适用于UNIX系统的快速入门指南,包括安装、配置和基本使用方法。 4. **高级话题**:深入讨论了HSQLDB的高级功能,如数据库连接管理、属性文件配置等。 5. **部署问题**:针对实际...
### HSQLDB快速上手实录 #### 一、引言 HSQLDB(HyperSQL Database)是一款基于Java编写的轻量级关系型数据库管理系统,它不仅具备高性能、易用性,而且支持标准的SQL语法及多种高级特性,非常适合用于开发、测试...
#### 四、UNIX快速入门 - **目的**:这部分专为UNIX系统的用户准备,提供了快速设置HSQLDB的步骤。 - **安装**:详细说明了如何在UNIX环境下安装HSQLDB,包括依赖库的安装等。 - **设置数据库实例和服务**:指导...
#### 五、UNIX环境下快速入门 - **安装**:在UNIX系统中安装HSQLDB。 - **创建持久数据库实例**:设置持久化的数据库实例。 - **HSQLDB SERVER配置**:启动并配置服务器。 - **访问数据库**:使用SQL工具或编程接口...
《HSQLDB中文文档入门学习》 HSQLDB(HyperSQL数据库)是一款开源、轻量级、嵌入式的Java关系型数据库管理系统,广泛应用于开发测试、小型应用以及单机应用中。它支持标准的SQL语法,并且具有高性能、低资源消耗的...
例如,引入了`spring-boot-starter-data-jpa`,那么Spring Boot会自动配置JPA和HSQLDB数据库支持。 **5. RESTful API** 对于Web服务,Spring Boot通过`@RestController`注解创建RESTful API。`@RequestMapping`和`@...
通过开发一个学生成绩管理系统,详细讲解了如何使用HSQLDB数据库、SQLExplorer插件、JavaBean以及DAO设计模式来实现数据的增删查改。这一章节不仅教授了数据库开发的基础知识,还引导读者掌握了面向对象的设计原则,...
java -cp ../../lib/hsqldb-1.8.0-10.jar org.hsqldb.Server ``` 当HSQLDB服务器成功启动时,终端输出会显示出相应的信息。 接下来,在IReport中创建新的连接。打开工具栏上的“数据源/连接”对话框,如图2所示。...
- **copy hsql.jar**:为了测试数据源配置,可能需要添加如HSQLDB这样的内存数据库JAR文件到类路径。 - **连接测试**:通过工具或代码进行数据源的连接测试,确保配置无误。 - **修改setting.xml文件**:根据项目...
Hibernate的入门学习主要包括理解这些基本概念和操作,后续深入学习则会涉及到复杂映射、事务处理、性能优化和缓存管理等高级话题。随着不断实践和学习,开发者可以充分利用Hibernate框架提供的各种特性,编写更加...
书中还通过实例讲解了数据库开发的内容,以学生成绩管理系统为例,介绍了如何使用HSQLDB数据库,并利用SQLExplorer插件连接数据库,创建成绩表,以及如何使用JavaBean映射成绩表和管理成绩。这个实例不仅涉及了...
JBPM 的流程定义和运行时的上下文需要被存储到关系型数据库中——可以是基于调试目的的内存数据库 HSQLDB,也可以是真正的持久化数据库(MySql,Oracle,PostgreSql,Sybase 等等)。JBPM 的流程设计一般都需要一个...