`
lunch
  • 浏览: 76133 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

Hsqldb简介和基本使用

阅读更多

        Hsqldb是一个开放源代码的JAVA数据库,其具有标准的SQL语法和JAVA接口,它可以自由使用和分发,非常简洁和快速的。具有Server模式,进程内模式(In-Process)和内存模式(Memory-Only)三种。运行Hsqldb需要hsqldb.jar包, 它包含了一些组件和程序。每个程序需要不同的命令来运行。它位于项目的lib目录下,目前的版本是1.8.0.5。官方的下载地址是:http://prdownloads.sourceforge.net/hsqldb/hsqldb_1_8_0_5.zip?download
        在介绍这些模式之前我们需要了解一些Hsqldb所涉及的一些文件。每个Hsqld数据库包含了2到5个命名相同但扩展名不同的文件,这些文件位于同一个目录下。例如,名位"test"的数据库包含了以下几个文件:

  • test.properties <o:p></o:p>
  • test.script <o:p></o:p>
  • test.log <o:p></o:p>
  • test.data <o:p></o:p>
  • test.backup

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

  接下来我们对Hsqldb的三种模式进行简单介绍,同时包括部分工具的启动的方式。

<o:p>一、 Server模式</o:p> 

 Server模式提供了最大的可访问性。应用程序(客户端)通过HsqldbJDBC驱动连接服务器。在服务器模式中,服务器在运行的时候可以被指定为最多10个数据库。根据客户端和服务器之间通信协议的不同,Server模式可以分为以下三种:

1 Hsqldb Serve

  这种模式是首选的也是最快的。它采用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.Propertiesmydb.scriptmydb.log等文件。其中demoDBmydb的别名,可在连接数据库时使用。<o:p></o:p>

<o:p>2 Hsqldb Web Server</o:p>

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

<o:p> 运行web服务器的时候,只要将刚才命令行中的主类(main class)替换成:org.hsqldb.WebServer</o:p><o:p></o:p>

3 Hsqldb Servlet

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

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

连接到以Server模式运行的数据库

  HSQLDB服务器运行时,客户端程序就可以通过hsqldb.jar中带有的HSQLDB JDBC Driver连接数据库。

java 代码
  1. try{   
  2.   
  3.          Class.forName("org.hsqldb.jdbcDriver") ;   
  4.   
  5.  }catch(ClassNotFoundException e){   
  6.   
  7.          e.printStackTrace();     
  8.   
  9.  }   
  10.   
  11.      Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb""sa""");   
  12.   

   hsqldb的默认用户是sa密码为空。修改默认密码的方法我们将在工具使用部分做出介绍。

<o:p></o:p> 二、 In-Process模式

  In-Process模式又称Standalone模式。这种模式下,数据库引擎作为应用程序的一部分在同一个JVM中运行。对于一些应用程序来说, 这种模式因为数据不用转换和通过网络的传送而使得速度更快一些。其主要的缺点就是默认的不能从应用程序外连接到数据库。所以当应用程序正在运行的时候,你不能使用类似于Database Manager的外部工具来查看数据库的内容。在<st1:chsdate isrocdate="False" w:st="on" year="1899" day="30" islunardate="False" month="12">1.8.0</st1:chsdate>版本中,你可以从同一个JVM的一个线程里面来运行一个服务器实例,从而可以提供外部连接来访问你的In-Process数据库。

  推荐的使用In-Process模式方式是:开发的时候为数据库使用一个HSQLDB 服务器实例,然后在部属的时候转换到In-Process内模式。

  一个In-Process模式数据库是从JDBC语句开始启动的,在连接URL中带有指定的数据库文件路径作为JDBC的一部分。例如,假如数据库名称为testdb,它的数据库文件位于与确定的运行应用程序命令相同的目录下,下面的代码可以用来连接数据库:

  Connection c = DriverManager.getConnection("jdbc:hsqldb:file:testdb<v:shapetype id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" filled="f" stroked="f" coordsize="21600,21600" o:spt="75"> <v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" o:extrusionok="f" gradientshapeok="t"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id="_x0000_i1025" title="" style="WIDTH: 5.25pt; HEIGHT: 5.25pt" alt="" outside="" page="" o:button="t" type="#_x0000_t75" visit=""><v:imagedata src="file:///C:\DOCUME~1\lunch\LOCALS~1\Temp\msohtml1\12\clip_image001.gif" o:href="http://130.1.11.14:7001/wiki/images/icons/linkext7.gif"></v:imagedata></v:shape>", "sa", "");

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

三、Memry-Only数据库


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

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

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

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

 四、 工具的使用


   Hsqldb提供的主要的工具类:

  • org.hsqldb.util.DatabaseManager 
  • org.hsqldb.util.DatabaseManagerSwing 
  • org.hsqldb.util.Transfer 
  • org.hsqldb.util.QueryTool 
  • org.hsqldb.util.SqlTool


  其中DatabaseManage和Sql Tool,只能用命令行参数来运行。你可以在命令行后面加上参数-?来查看这些工具可用的参数列表。其他工具可以通过DatabaseManager的主界面启动,便于交互式操作。

  为了便于操作,我们同样把这些工具启动的命令做成批处理文件。方法和前面我们所介绍的创建启动服务模式命令的方法一样。在这里我们再强调一次hsqldb.jar的位置,因为所有启动命令都是参照hsqldb.jar的位置编写的

  如果您觉得麻烦你也可以采用绝对路径编写命令。

  现在我们一起运行AWT版本的DatabaseManager工具,hsqldb.jar位于相对于当前路径的../lib下面,命令如下:

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

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


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

  • Recent:选择你最近的登录方案,[可选] 
  • Setting Name:本次登录方案名称,如果本次登录成功,那么等你下次登录的时候在Recent下拉列表中将看到你的成功登录方案[可选] 
  • Type:登录模式,其中包括In-Memory模式、Standalone(In-process)模式、Server模式、WebServer模式... ...[必选] 
  • Driver:连接数据库的驱动程序[必选] 
  • URL:连接数据库的URL[必选] 
  • User:用户名[必选] 
  • Password:密码[ 除非密码为空]


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

  如果你想运行DatabaseManagerSwing也很简单,相信你已经想到了。我们只需要把启动DatabaseManager命令修改成:
  Java -cp ../lib/hsqldb.jar org.hsqldb.util. DatabaseManagerSwing

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

        差点忘记,前面我说过要给出修改sa用户密码的方法。最后再占用大家一点点时间。当你用SA通过DatabaseManager登录成功后会出现如下界面:

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

  到这里我们对Hsqldb的简单介绍就结束了。

  本文参考自Hsqldb的官方文档,个人水平有限难免出现错误,

  • 大小: 483.8 KB
  • 大小: 288.3 KB
分享到:
评论
31 楼 z00001 2007-09-03  
谢谢,受益匪浅!
30 楼 抛出异常的爱 2007-07-25  
表结构的话不用自己写
hsql可以根据hibernate文件生成对应的表结构。
前面所说的script是说已存在的定制数据。
比如字典,规则表结构 等基础数据。

用ibatis也可以作不过还是有必要用表生成文件的。
我用PL/SQL developer导出的表结构文件也可以生成全表。

PS:KISS是保持简单的意思,对于复杂的环境想要定位错误是非常困难的。
所以一定要保持数据的简单,以达到不粘连其它错误。
29 楼 withoutmewang 2007-07-24  
抛出异常的爱 写道
还是那句话,KISS
简单的数据库找起来才好
快速了解程序的本质问题
而不是乱猜问题在哪里。

我现在的数据库“夹具”里有四条数据
我认为够了。
夹具就是一个特别的sript只有几条普通的数据;
而病态的数据还是靠程序中用commit植入的。


异常能简单介绍下KISS吗?
我提的是和学友兄一样的问题,script如何自动生成。学友是用hbm2dll生成的,但我目前是iBatis,我想应该有其他办法的
28 楼 抛出异常的爱 2007-07-24  
还是那句话,KISS
简单的数据库找起来才好
快速了解程序的本质问题
而不是乱猜问题在哪里。

我现在的数据库“夹具”里有四条数据
我认为够了。
夹具就是一个特别的sript只有几条普通的数据;
而病态的数据还是靠程序中用commit植入的。
27 楼 withoutmewang 2007-07-24  
还好是用powerDesigner创建表结构的
遗憾的是powerDesigner不支持创建hsqldb脚本

权宜之计,用mysql作为测试数据库了
26 楼 withoutmewang 2007-07-24  
从hbm生成script吗?
那ibatis就行不通了
25 楼 xly_971223 2007-07-24  
withoutmewang 写道
xly_971223 写道
抛出异常的爱 写道
hibernate可以生成数据库的表。。。但数据还要自己加

我用过用hibernate的hbm2ddl 可以生成表结构
但是添加数据不知道从那个地方加 
尝试写在script文件中 不要create table 只保留insert 会报错
异常兄有没有例子 给发一个


老兄,有其他办法生成script吗?
俺用的是ibatis,数据库是oracle。想从oracle转到hsqldb。。。
自己敲的话,疯了

22楼是我找到相对简单的方法
24 楼 withoutmewang 2007-07-24  
xly_971223 写道
抛出异常的爱 写道
hibernate可以生成数据库的表。。。但数据还要自己加

我用过用hibernate的hbm2ddl 可以生成表结构
但是添加数据不知道从那个地方加 
尝试写在script文件中 不要create table 只保留insert 会报错
异常兄有没有例子 给发一个


老兄,有其他办法生成script吗?
俺用的是ibatis,数据库是oracle。想从oracle转到hsqldb。。。
自己敲的话,疯了
23 楼 过河卒 2007-05-16  
很期待更多的内容,非常需要! 谢谢LZ
22 楼 xly_971223 2007-05-14  
又遇到问题了 oracle的sequence在hsqldb有没有对应的东东
如下:
<hibernate-mapping>
    <class name="com.ecc.domain.Category" table="CATEGORY" schema="DIGITALSTORE">
        <id name="categoryId" type="long">
            <column name="CATEGORY_ID" precision="5" scale="0" />
            <generator class="sequence" >
                <param name="sequence">Category_seq</param>            
            </generator>
        </id>
        <property name="categoryName" type="string">
            <column name="CATEGORY_NAME" length="20" not-null="true" />
        </property>
        <property name="parentId" type="long">
            <column name="PARENT_ID" precision="5" scale="0" not-null="true" />
        </property>
        <property name="description" type="string">
            <column name="DESCRIPTION" length="100" />
        </property>
        <set name="products" inverse="true">
            <key>
                <column name="CATEGORY_ID" precision="5" scale="0" />
            </key>
            <one-to-many class="com.ecc.domain.Product" />
        </set>
    </class>
</hibernate-mapping>

这个Category_seq在 hsqldb中怎么处理?hsqldb应该是不支持sequence吧
我是用的hibernae的increament 等到上线的时候在改成Category_seq
不知道有没有更好的方法
21 楼 xly_971223 2007-05-14  
有一个相对简便的方法 先配置成hibernate.hbm2ddl.auto=create-drop 映射文件在加载的时候会输出如下信息
2007-05-14 22:40:31,520 ERROR [org.hibernate.tool.hbm2ddl.SchemaExport] - Unsuccessful: create table DIGITALSTORE.CATEGORY (CATEGORY_ID bigint not null, CATEGORY_NAME varchar(20) not null, PARENT_ID bigint not null, DESCRIPTION varchar(100), primary key (CATEGORY_ID))
2007-05-14 22:40:31,540 ERROR [org.hibernate.tool.hbm2ddl.SchemaExport] - The database is in read only mode in statement [create]
2007-05-14 22:40:31,540 ERROR [org.hibernate.tool.hbm2ddl.SchemaExport] - Unsuccessful: create table DIGITALSTORE.CUSTOMER (CUSTOM_ID bigint not null, CUSTOM_NAME varchar(16), PASSWORD varchar(32) not null, EMAIL varchar(64), NICKNAME varchar(16) not null, SEX varchar(1), ADDRESS varchar(256), PHONE varchar(16), POSTALCODE varchar(8), REGISTER_DATE varchar(255), LAST_LOGIN varchar(255), primary key (CUSTOM_ID), unique (EMAIL))
2007-05-14 22:40:31,540 ERROR [org.hibernate.tool.hbm2ddl.SchemaExport] - The database is in read only mode in statement [create]
2007-05-14 22:40:31,540 ERROR [org.hibernate.tool.hbm2ddl.SchemaExport] - Unsuccessful: create table DIGITALSTORE.CUSTOM_ORDER (ORDER_ID bigint not null, CUSTOM_ID bigint, RECEIVER_NAME varchar(16), RECEIVER_ADDR varchar(256), RECEIVER_PHONE varchar(16), RECEIVER_POSTALCODE varchar(8), RECEIVER_EMAIL varchar(64), ORDER_STATE varchar(1), ORDER_DATE varchar(255), INVOICE_INFO varchar(1024), PAYMENT_WAY varchar(1), primary key (ORDER_ID))

拷贝这些create语句到script文件 然后修改一下就能用了
写完之后删除hibernate.hbm2ddl.auto=create-drop 就行了

比较乱 凑合着看吧
20 楼 shaucle 2007-05-14  
xly_971223 写道
shaucle 写道
xly_971223 写道
问一下楼主 hsqldb的script文件是怎么生成的?手工敲的呢还是有什么工具导出的
还是用的hibernate的hbm2ddl?


手工敲.......

script就是db文件

有没有更简便的方法呢 手工敲会死人的


俺的意思是不用 手工敲
不然俺就只好打.....了


ps:官方文档还不错
http://hsqldb.org/web/hsqlDocsFrame.html
而且这个源代码的确值得一看
19 楼 lunch 2007-05-14  
以后我会注意的。
整理好再发。。。
异常的爱,好有个性的名字!
18 楼 抛出异常的爱 2007-05-14  
你发的那日期。。。。汗。。。内容太单薄

楼上可以发40个新手贴才会被禁言
17 楼 xly_971223 2007-05-14  
lunch 写道
我的意思是Hibernate可以生成表文件,呵呵:)
还有在测试的时候建议使用回滚的方式,还是不要保留测试数据的好。可以考虑Spring的AbstractTransactionalDataSourceSpringContextTests。呵呵这个类明可是超长啊...

郁闷,今天一不小心又发了一片新手贴,又扣了10分。哈哈。。。

我现在发帖基本都是去新手版 总得有地方让人活吧
16 楼 lunch 2007-05-14  
我的意思是Hibernate可以生成表文件,呵呵:)
还有在测试的时候建议使用回滚的方式,还是不要保留测试数据的好。可以考虑Spring的AbstractTransactionalDataSourceSpringContextTests。呵呵这个类明可是超长啊...

郁闷,今天一不小心又发了一片新手贴,又扣了10分。哈哈。。。
15 楼 抛出异常的爱 2007-05-14  
那样在看测试代码时。。。。不认为是个好办法。。。
KISS
14 楼 xly_971223 2007-05-14  
抛出异常的爱 写道
xly_971223 写道
抛出异常的爱 写道
hibernate可以生成数据库的表。。。但数据还要自己加

我用过用hibernate的hbm2ddl 可以生成表结构
但是添加数据不知道从那个地方加 
尝试写在script文件中 不要create table 只保留insert 会报错
异常兄有没有例子 给发一个


我是在junit的程序中加,用到什么加什么。。。离的近看的清楚
t.begainTxxxxx();
save(o);
t.commit();

这也是一种办法 但是我觉得预先加载一些数据更方便一些
13 楼 抛出异常的爱 2007-05-14  
xly_971223 写道
抛出异常的爱 写道
hibernate可以生成数据库的表。。。但数据还要自己加

我用过用hibernate的hbm2ddl 可以生成表结构
但是添加数据不知道从那个地方加 
尝试写在script文件中 不要create table 只保留insert 会报错
异常兄有没有例子 给发一个


我是在junit的程序中加,用到什么加什么。。。离的近看的清楚
t.begainTxxxxx();
save(o);
t.commit();
12 楼 xly_971223 2007-05-14  
抛出异常的爱 写道
hibernate可以生成数据库的表。。。但数据还要自己加

我用过用hibernate的hbm2ddl 可以生成表结构
但是添加数据不知道从那个地方加 
尝试写在script文件中 不要create table 只保留insert 会报错
异常兄有没有例子 给发一个

相关推荐

    HSQLDB简介和基本使用.doc

    HSQLDB简介和基本使用 HSQLDB简介和基本使用 HSQLDB简介和基本使用

    Hsqldb安装与使用

    图示和说明详细介绍Hsqldb安装与使用.

    hsqldb包和使用说明

    里面有hsqldb.jar包,一份中文使用说明,服务器和控制台. 作测试十分好用!

    hsqldb使用(转载)

    hsqldb确实是个好东西,对于系统演示,开发等都很方便。

    hsqldb实例源代码

    简单的创建两个例子,如何创建hsqldb,如何使用hsqldb查询数据等。

    hsqldb使用方法

    HSQLDB是一个开放源代码的JAVA数据库,其具有标准的SQL语法和JAVA接口,它可以自由 使用和分发,非常简洁和快速的。具有SERVER模式,进程内模式(IN-PROCESS)和内存模式 (MEMORY-ONLY)三种。运行HSQLDB需要HSQLDB.JAR...

    hsqldb-2.5.0.jar

    hsqldb数据库下载,很好用,简易的内存数据库,特别适合初学者。

    hsqldb jdbc driver

    hsqldb jdbc driver适合于hsqldb

    HSQLDB 1.8.0

    HSQLDB 1.8.0

    hsqldb-2.2.8数据库

    Hsqldb是一个开放源代码的JAVA数据库,其具有标准的SQL语法和JAVA接口,它可以自由使用和分发,非常简洁和快速。

    hsqldb-2.3.2.zip

    hsqldb 2 3 2 zip HyperSQL是用Java编写的一款SQL关系数据库引擎 它的核心完全是多线程的 支持双向锁和MVCC 多版本并发控制 几乎完整支持ANSI 92 SQL 支持常见数据类型 最新版本增加了对BLOB和CLOB数据的支持 最高...

    hsqldb-1.7.1.jar

    数据库连接 hsqldb1.7.1.jar

    hsqldb的最新版本

    hsqldb的最新1.9.0版本,支持windows操作系统

    hsqldb 2.25

    hsqldb for jdk1.5因为hsqldb的2.0版本以上都是jdk1.6进行编译的,我提供的这个2.25版本的是jdk1.5编译的。

    hsqldb jar

    hsqldb jar

    HSQLDB中文手册

    HSQLDB中文手册

    hsqldb-lib.zip

    hsqldb可能需要的额外jar包 Additional Jar files needed for hsqldb.

    HSQLDB快速连接数据库

    HSQLDB中文文档,能够提高数据的处理速度。

    hsqldb-2.4.0.zip

    hsqldb-2.4.0

Global site tag (gtag.js) - Google Analytics